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没有函数重载,注意这里还手动对函数根据参数个数不同进行了重载,尽量让程序健壮。注释很详细了。

  • 相关阅读:
    Pycharm(Mac版)快捷键操作篇
    Ubuntu报E: 仓库 “http://ppa.launchpad.net/webupd8team/sublime-text-3/ubuntu bionic Release” 没有 Release 文件。
    Ubuntu安装出现无法锁定管理目录是否有其他进程正在占用它?
    解决Ubuntu(18.04LTS)和win10电脑之间无法复制粘贴问题
    数据库的基本查询
    Ubuntu下数据库的操作
    Ubuntu中vi上下左右键退格键失灵的问题
    Ubuntu 18.04TLS命令安装Pycharm并固定在快速启动栏
    Ubuntu下mysql连接Navicat premium报错
    Ubuntu安装mysql报ERROR 1698 (28000): Access denied for user 'root'@'localhost',有效的解决办法
  • 原文地址:https://www.cnblogs.com/zhangmingzhao/p/7882688.html
Copyright © 2011-2022 走看看