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个独立查询来获取计数并获取所需文档更快.希望这可以帮助.
我曾与解决它$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只是它们的分页切片。
这些解决方案的问题在于,对于每个请求,您都要进行两次查询。当您拥有复杂的数据结构和大型数据集时,这就会成为问题,因为性能成为问题。考虑创建一个特殊的函数来监听/resource?count=true或/resource/countGET 方法并只返回计数。
您需要执行 2 个查询才能实现此目的。一个用于获取结果,另一个用于使用.count()获取总项目数量。
例如,您可以观看 mongoose mongoose-paginate的“paginator”部分的代码。
| 归档时间: |
|
| 查看次数: |
6556 次 |
| 最近记录: |