Javascript 如何在MongoDB中对聚合查询结果进行分页,并获得文档总数(Node.js+;Mongoose)?
我想通过$limit和$skip对查询结果进行分页,并获得通过查询的文档总数 我现在要做的是对结果进行分页:Javascript 如何在MongoDB中对聚合查询结果进行分页,并获得文档总数(Node.js+;Mongoose)?,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我想通过$limit和$skip对查询结果进行分页,并获得通过查询的文档总数 我现在要做的是对结果进行分页: const startIndex = (page - 1) * limit const endIndex = page * limit const resultObject = {} resultObject.totalCount = await model.countDocuments(query).exec() if (endIndex < result
const startIndex = (page - 1) * limit
const endIndex = page * limit
const resultObject = {}
resultObject.totalCount = await model.countDocuments(query).exec()
if (endIndex < results.totalCount)
resultObject.next = {page: page + 1, limit}
if (startIndex > 0)
results.prev = {page: page - 1, limit}
resultObject.results = await query.limit(limit).skip(startIndex).exec()
const startIndex=(第1页)*限制
const endIndex=页面*限制
常量resultObject={}
resultObject.totalCount=await model.countDocuments(query.exec())
if(endIndex0)
results.prev={page:page-1,limit}
resultObject.results=wait query.limit(limit).skip(startIndex.exec())
这会产生两个问题:
- 我执行了两次查询(你能在1中执行吗?)
- 由于某种原因,当我的查询是聚合时,
返回0,即使当我执行countDocuments
时,我得到了正确的结果(>0)query.exec()
resultObject
- “我执行了两次查询(你能在1中执行吗?”“不,你不能,实现这一点的唯一方法是获取整个集合,然后在代码中返回所需的文档,这显然是一个非常糟糕的解决方案
- 这有点棘手,从技术上讲,这是一个只执行管道的包装器:
db.collection.countDocuments({});
等于:
db.collection.aggregate([
{
$group: {
_id: null,
count: {$sum: 1}
}
}
]);
但是,不同的驱动程序支持此命令的方式不同,例如,nodejs
Mongo驱动程序不允许按指定使用某些表达式。您还使用了mongoose
,这可能会有额外的更改
如果不查看您的确切查询,很难说它失败的原因,但是如果您找不到原因,我建议只执行包装管道。我找到了一种方法,可以在数据库的同一“行程”中获得查询结果和计数(仍有2个查询,但在数据库中,因此速度要快得多) 关键是要使用
$facet
(mongodb 3.4+):
解释:$facet
在同一输入(我们的查询结果)上执行多个管道。我们可以有1个管道用于对结果分页,1个管道用于计算总数
由于$count
返回一个包含count
字段的对象,并且facet包装在一个数组中,$addFields
管道将实际的count
值提取为total
字段。然后我只使用$project
删除不再需要的totalCount
,结果如下:
{
paginatedResults: [RESULTS],
total: 34
}
{
paginatedResults: [RESULTS],
total: 34
}