获取总计数和Mongoose Query skip&limt

gov*_*ind 7 database mongoose mongodb node.js aggregation-framework

我有一个包含许多对象的json数据.我想限制分页数据,我需要总项数.请帮忙.

Model.find().skip((pageNumber-1)*limit).limit(limit).exec()
Run Code Online (Sandbox Code Playgroud)

我想要计数和跳过数据作为回应.

Jib*_*ews 12

您可以使用异步库一次运行2个查询.在您的情况下,您可以运行一个查询来获取文档的数量,另一个查询用于分页.

"用户"模型示例:

    var async = require('async');
    var User = require('./models/user');

    var countQuery = function(callback){
         User.count({}, function(err, count){
               if(err){ callback(err, null) }
               else{
                   callback(null, count);
                }
         }
    };

    var retrieveQuery = function(callback){
        User.find({}).skip((page-1)*PAGE_LIMIT)
                     .limit(PAGE_LIMIT)
                     .exec(function(err, doc){
                            if(err){ callback(err, null) }
                            else{
                            callback(null, doc);
                            }
                      }
    };

    async.parallel([countQuery, retrieveQuery], function(err, results){
         //err contains the array of error of all the functions
         //results contains an array of all the results
         //results[0] will contain value of doc.length from countQuery function
         //results[1] will contain doc of retrieveQuery function
         //You can send the results as

         res.json({users: results[1], pageLimit: PAGE_LIMIT, page: page, totalCount: results[0]});

    });
Run Code Online (Sandbox Code Playgroud)

async允许您并行运行多个查询,具体取决于您使用的硬件.这比使用2个独立查询来获取计数并获取所需文档更快.希望这可以帮助.


gaz*_*rgo 8

我曾与解决它$facet,并aggregate在猫鼬V3 +方式如下:

const [{ paginatedResult, [{ totalCount }] }] = await Model.aggregate([{
  $facet: {
    paginatedResult: [
      { $match: query },
      { $skip: skip },
      { $limit: limit }
    ],
    totalCount: [
      { $match: query },
      { $count: 'totalCount' }
    ]
  }
}])
Run Code Online (Sandbox Code Playgroud)

其中totalCount指的是匹配搜索查询的记录总数,而paginatedResult只是它们的分页切片。


Pbr*_*n19 5

这些解决方案的问题在于,对于每个请求,您都要进行两次查询。当您拥有复杂的数据结构和大型数据集时,这就会成为问题,因为性能成为问题。考虑创建一个特殊的函数来监听/resource?count=true/resource/countGET 方法并只返回计数。


Ale*_* B. 3

您需要执行 2 个查询才能实现此目的。一个用于获取结果,另一个用于使用.count()获取总项目数量。

例如,您可以观看 mongoose mongoose-paginate的“paginator”部分的代码。