• NodeJs操作MongoDB之分页功能与常见问题


    NodeJs操作MongoDB之分页功能与常见问题

    一,方法介绍

     1,聚合操作之count

    count()方法可以查询统计符合条件的集合的总数

    1 db.User.count(<query>) // 此方法等价于 db.User.find(<query>).count()

    在分布式集合中,会出现计算错误的情况,这个时候推荐使用aggregate;

     2,find() 方法以非结构化的方式来显示所有文档。

    1 db.User.find();//相当于:select* from User;

    3,exec() 方法用于检索字符串中的正则表达式的匹配。(javascript方法)

    4,sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。

    1 升序:db.User.find().sort({CreateTime: 1});
    2 降序:db.User.find().sort({CreateTime: -1});

    5,skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。

    1 db.User.find().skip(2)//跳过2条

    6,limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数。一般与skip连用

    1 # limit()中number值为空时代表全部查出
    2 db.User.find().limit(2) #读取的条数
    1 # 常用在分页方法中
    2 # 查询User集合中,跳过前两条记录,每页一条记录
    3 > db.User.find().skip(2).limit(1)

    二,封装与接口抛出

    2.1,分页查询

      1,根据查询条件获取总条数,使用count({},callback)方法

     1 /**
     2  * 根据条件获取有多少条数据 文档数
     3  * @param table_name 表名
     4  * @param conditions 查询条件 {a:1, b:2}
     5  * @param callback 回调方法
     6  */
     7 MongoDbAction.getTotal = function (table_name, conditions, callback) {
     8     var node_model = this.getConnection(table_name);
     9     if (!node_model || node_model.message) {
    10         if (callback) callback(1, node_model)
    11     } else {
    12         node_model.find(conditions)
    13             .count({})
    14             .exec(function (err, total) {
    15                 if (err) {
    16                     if (callback) callback(err);
    17                 } else {
    18                     if (callback) callback(null, total);
    19                 }
    20             });
    21     }
    22 };

    2,实现连写查询

     (1)这个可以用来做分页,表示获取从第1条(第1条记录序号为0)记录开始的10条记录.类似与Mysql的limit 0, 10,如下:

    {

        limit:10,//pageSize
        skip:0//page:skip+1
    }
    (2)按某个字段升序(1)降序(-1),如下 按照创建时间进行降序排列
    sort: {CreateTime: -1},
    (3)代码连写查询实现:
     1 /**
     2  * 连写查询 查询多条数据
     3  * @param table_name 表名
     4  * @param conditions 查询条件 {a:1, b:2}
     5  * @param options 选项:{fields: "a b c", sort: {time: -1}, limit: 10}
     6  * @param callback 回调方法
     7  */
     8 MongoDbAction.whereCondition = function (table_name, conditions, options, callback) {
     9     var node_model = this.getConnection(table_name);
    10     if (!node_model || node_model.message) {
    11         if (callback) callback(1, node_model)
    12     } else {
    13         node_model.find(conditions)
    14             .select(options.fields || '')
    15             .sort(options.sort || {})//排序 //按某个字段升序(1)降序(-1)
    16             .skip(options.skip || 0)//跳过的条数
    17             .limit(options.limit || {})//查询几条
    18             .exec(function (err, res) {
    19                 if (err) {
    20                     if (callback) callback(err);
    21                 } else {
    22                     if (callback) callback(null, res);
    23                 }
    24             });
    25     }
    26 };

    3,根据所传的参数实现分页查询

    抛出分页查询的接口

     1 //连写查询数据 包括分页 获取总条数
     2 router.put('/user/getSingleAndManyData', function (req, res) {
     3     var tableName = req.body.tableName;//'User'
     4     var IsEnable = req.body.IsEnable;
     5     var limit = req.body.pageSize;
     6     var sort = req.body.sort;
     7     var skip = req.body.page;
     8     let conditions = {
     9         IsEnable
    10     }
    11     let options = {
    12         sort: {CreateTime: sort},//排序
    13         limit,//pageSize
    14         skip:(limit*(skip-1))//page
    15     }
    16     // let options = {
    17     //     sort: {CreateTime: -1},//按某个字段升序(1)降序(-1)
    18     //     limit:10,
    19     //     skip:(limit*(skip-1))//skip=1=> skip:0
    20     // }
    21     //  这个可以用来做分页,表示获取从第1条(第1条记录序号为0)记录开始的10条记录.类似与Mysql的limit 0, 10
    22     let data = {
    23         httpCode: 200,
    24         message: "查询成功!",
    25         status: 1,
    26         data: null,
    27         page:skip,
    28         pageSize:limit
    29     }
    30     
    31     MongoDbAction.getTotal(tableName,conditions, function (err, total) {
    32         if (err) {
    33             data.total=0
    34             data.status = 0
    35             data.message = "未查询到数据!"
    36             data.data = null
    37             res.status(data.httpCode).json(data);
    38         } else {
    39             MongoDbAction.whereCondition(tableName,conditions,options, function (err, result) {
    40                 if (!err) {
    41                     data.total=total
    42                     data.data = result
    43                     res.status(data.httpCode).json(data);
    44                 } else {
    45                     data.total=0
    46                     data.status = 0
    47                     data.message = "未查询到数据!"
    48                     data.data = result
    49                     res.status(data.httpCode).json(data);
    50                 }
    51             });
    52         }
    53     });
    54    
    55 })

     4,接口调用,返回的结果集如下:

    三,常见问题

    1,连接警告

    警告:(node:204) DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect.

    1 mongoose.connect(dbURL);// 连接数据库 存在警告

    解决办法:连接配置添加: { useNewUrlParser: true }

    1 mongoose.connect(dbURL,{useNewUrlParser:true});//连接数据库
  • 相关阅读:
    box-sizing: border-box的作用
    什么时候用created,什么时候用mounted
    圣杯布局
    关闭浏览器 清除session
    js this
    js 深拷贝
    经常犯的一些小错误
    语法:c++对关于空指针0/NULL/nullptr三者的演变
    常用的函数
    C++一些小技巧
  • 原文地址:https://www.cnblogs.com/jackson-yqj/p/10291505.html
Copyright © 2020-2023  润新知