Node.js环境下对MongoDB实现查,插,分页功能

来源:互联网 发布:app的运营数据分析 编辑:程序博客网 时间:2024/06/03 20:36

写法上还是模块化,尽量把不同职责的代码分开,避免"万能类",尽量采用MVC。

连接,创建数据库,插入数据

  db.js:

  

//这个模块里面封装了所有对数据库的常用操作var MongoClient = require('mongodb').MongoClient;//不管数据库什么操作,都是先连接数据库,所以我们可以把连接数据库//封装成为函数function _connectDB(callback) {    var url = "MongoDB://127.0.0.1/haha";    MongoClient.connect(url, function (err,db) {        if(err) {            callback(err,null);            return;        }        callback(err,db);    });}exports.insertOne = function (collectionName, json, callback) {    _connectDB(function (err,db) {            if(err) {                callback(err,null);                return;            }            db.collection(collectionName).insertOne(json, function (err, result) {                callback(err, result);                db.close();//关闭数据库            })        });}exports.find = function (collectionName,json,callback) {    var result = [];   //结果数组    if(arguments.length != 3) {        callback("find函数接受三个参数",null);        return ;    }    //链接数据库,链接之后查找所有    _connectDB(function (err,db) {        var cursor = db.collection(collectionName).find(json);        cursor.each(function (err, doc) {            if(err) {                callback(err,null);                return;            }           if(doc != null) {               result.push(doc); //放入结果数组           }else {               //遍历结束,没有更多的文档                callback(null,result);           }        });    });}

01.js:

var express = require("express");var app = express();var MongoClient = require('mongodb').MongoClient;app.get("/",function (req,res) {    //url就是数据库地址,/表示数据库    //假如数据库不存在,没有关系,程序会帮你自动创建一个数据库    var url = "mongodb://localhost:27017/haha";    //连接数据库    MongoClient.connect(url, function(err, db) {        //回调函数表示链接成功做的事情,db参数就是连接上的数据库实体        if(err) {            console.log("数据库连接失败");            return ;        }        console.log("连接数据库成功");        //插入数据,集合如果不存在,也没有关系,程序会帮你创建        db.collection("student").insertOne({            "name" : "哈哈",            "age" : parseInt(Math.random()*100 + 10)        }, function(err, result) {            if(err) {                console.log("插入失败");                return ;            }            console.log("插入成功");            console.log(result);            res.send(result);            db.close();        });        db.close();    });});app.listen(3000);

 

1版本分页

  在db.js这种版本的分页效率是比较低的,因为已经查询了所有数据库,然后筛选需要push进数组。

02.js:

var express = require("express");var app = express();var db = require("./model/db.js");app.get("/",function (req,res) {    db.insertOne("teacher",{"name":"小红"},function (err,result) {        if(err) {            console.log("插入失败");        }        res.send("插入成功");    });});app.get("/du",function (req, res) {    //这个页面现在接受一个page参数。    var page = parseInt(req.query.page); //express中读取get参数很简单    var a = [];    db.find("student",{},function (err,result) {        //这是一种分页查询的笨方法,效率低,因为已经查询了所有数据库,然后再回调里面筛选        for(var i = 10 * page; i < 10*(page + 1); i++ ) {            a.push(result[i]);        }        res.send(a);    });});app.listen(3000);

 

2版本分页

利用mongodb自带的函数limit()和skip(),重写db2.js,实现分页,但是这两个函数底层是怎么实现的呢,据说效率蛮高,底层实现这里暂时先不探究,日后专门开一篇来探讨。

//优化后,加入skip,limit参数的写法//这个模块里面封装了所有对数据库的常用操作var MongoClient = require('mongodb').MongoClient;//不管数据库什么操作,都是先连接数据库,所以我们可以把连接数据库//封装成为函数function _connectDB(callback) {    var url = "MongoDB://127.0.0.1/haha";    MongoClient.connect(url, function (err,db) {        if(err) {            callback(err,null);            return;        }        callback(err,db);    });}exports.insertOne = function (collectionName, json, callback) {    _connectDB(function (err,db) {            if(err) {                callback(err,null);                return;            }            db.collection(collectionName).insertOne(json, function (err, result) {                callback(err, result);                db.close();//关闭数据库            })        });}exports.find = function (collectionName,json,C,D) {    var result = [];   //结果数组    //JS没有函数重载,只能手动实现    if(arguments.length == 3) {       //如果没有传args        //那么参数C就是callback,参数D没有传。        var callback = C;        var skipnumber = 0;        //数目限制,limit(0)就是没有限制        var limit = 0;    }else if(arguments.length == 4) {        var args = C;        var callback = D;        //应该省略的条数        var skipnumber = args.pageamount * args.page;        //数目限制        var limit = args.pageamount;    }else {        throw new Error("find函数的参数个数,必须是3个,或者4个");        return;    }    //从第零页开始    console.log("略过了"+skipnumber+"条"+"限制在"+limit+"条");    //链接数据库,链接之后查找所有    _connectDB(function (err,db) {        var cursor = db.collection(collectionName).find(json).skip(skipnumber).limit(limit);        cursor.each(function (err, doc) {            if(err) {                callback(err,null);                return;            }           if(doc != null) {               result.push(doc); //放入结果数组           }else {               //遍历结束,没有更多的文档                callback(null,result);           }        });    });}

03.js:

//limit,skip高效率做法var express = require("express");var app = express();var db = require("./model/db2.js");app.get("/",function (req,res) {    db.insertOne("teacher",{"name":"小红"},function (err,result) {        if(err) {            console.log("插入失败");        }        res.send("插入成功");    });});app.get("/du",function (req, res) {    //这个页面现在接受一个page参数。    var page = parseInt(req.query.page); //express中读取get参数很简单    //每页10个,查第三页    // db.find("student",{},{"pageamount":5,"page":page},function (err,result) {    // db.find("student",{},function (err,result) {    //注意这个结果还是5条,是先find在age大于50情况的结果集里面skip和limit        db.find("student",{"age":{$gt:50}},{"pageamount":5,"page":page},function (err,result) {        if(err) {            console.log(err);        }        res.send(result);    });});app.listen(3000);

因为原生js没有函数重载,注意这里还手动对函数根据参数个数不同进行了重载,尽量让程序健壮。注释很详细了。

原创粉丝点击