zoukankan      html  css  js  c++  java
  • Node.js环境下对MongoDB实现查,插,分页功能

    写法上还是模块化,尽量把不同职责的代码分开,避免"万能类",尽量采用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没有函数重载,注意这里还手动对函数根据参数个数不同进行了重载,尽量让程序健壮。注释很详细了。

  • 相关阅读:
    VIJOS-P1340 拯救ice-cream(广搜+优先级队列)
    uva 11754 Code Feat
    uva11426 GCD Extreme(II)
    uvalive 4119 Always an Interger
    POJ 1442 Black Box 优先队列
    2014上海网络赛 HDU 5053 the Sum of Cube
    uvalive 4795 Paperweight
    uvalive 4589 Asteroids
    uvalive 4973 Ardenia
    DP——数字游戏
  • 原文地址:https://www.cnblogs.com/zhangmingzhao/p/7882688.html
Copyright © 2011-2022 走看看