我可以运行查询来获取确切的文档数量吗?
我有收藏:
> db.circle.find() { "_id" : 1 } { "_id" : 2 } { "_id" : 3 }
执行查询:
> db.circle.find().skip(2).limit(2) { "_id" : 3 }
响应 1 个文档,但我需要 2
查看此回复的最佳方式是什么?
{ "_id" : 3 } { "_id" : 1 }
最佳答案
我找到了一种使用聚合框架在一个查询中解决此问题的方法:
result = db.circle.aggregate([
{
$project: {
virtual_id: { $ifNull: [null, [1, 2]] }
// extra fields go here...
}
},
{ $unwind: '$virtual_id' },
{ $sort: { virtual_id: 1, _id: 1 } },
{ $skip: 2 },
{ $limit: 2 }
]);
这基本上会复制数据集,将其附加到末尾,然后应用跳过和限制操作。
步骤:
$project
添加virtual_id
字段,并将数组[1, 2]
作为值添加到每个文档。添加具有静态值的字段的$ifNull
方法是我在 this answer 中找到的一个很好的技巧。 .$unwind
byvirtual_id
使数据集加倍。$sort
确保两个串联数据集的排序正确。执行此操作后,_id
值为:1, 2, 3, 1, 2, 3
。$skip
和$limit
做显而易见的事情
注释1
如果除了 _id
之外您还需要检索任何其他字段,则应在 $project
操作中指定它们(_id
是默认检索)。例如,要在输出中获取 extra_field
和 yet_another_field
的值,请执行以下操作:
$project: {
virtual_id: { $ifNull: [null, [1, 2]] },
extra_field: 1,
yet_another_field: 1
}
注释2
此解决方案可能不适合非常大的数据集,因为:
- 聚合框架的输出大小有限(我认为是 16MB)
$sort
操作的成本可能很高,因为无法定义任何索引来覆盖virtual_id
关于mongodb - Mongo循环查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21040269/