Mongodb Mongo循环查询
我可以运行查询以获取文档的确切数量吗 我收集了: > db.circle.find() { "_id" : 1 } { "_id" : 2 } { "_id" : 3 } >db.circle.find() {u id:1} {u id:2} {u id:3} 执行查询: > db.circle.find().skip(2).limit(2) { "_id" : 3 } >db.circle.find().skip(2).limit(2) {u id:3} 回应1个文件,但我需要2个 看到这种反应的最佳方式是什么 { "_id" : 3 } { "_id" : 1 } {u id:3} {u id:1} 因此,在您的代码中,Mongodb Mongo循环查询,mongodb,Mongodb,我可以运行查询以获取文档的确切数量吗 我收集了: > db.circle.find() { "_id" : 1 } { "_id" : 2 } { "_id" : 3 } >db.circle.find() {u id:1} {u id:2} {u id:3} 执行查询: > db.circle.find().skip(2).limit(2) { "_id" : 3 } >db.circle.find().skip(2).limit(2) {u id:3} 回应1
db.circle.find().skip(2).limit(2)
,它将跳过前2个文档,并返回下2个文档。
有关更多详细信息,请参阅
如果要跳过具有特定ID的文档,请使用运算符:
db.circle.find({"_id":{ "$ne" : 2}})
它将向您返回以下文件:
{ "_id" : 3 }
{ "_id" : 1 }
我使用了
db.collection.count()
:
db.collection.count()
返回与find()查询匹配的文档数。这个
db.collection.count()方法不执行find()操作,但
而是计算并返回与查询匹配的结果数
我在一个使用聚合框架的查询中找到了解决此问题的方法:
result=db.circle.aggregate([
{
$项目:{
虚拟_id:{$ifNull:[null[1,2]]}
//这里有额外的字段。。。
}
},
{$unwind:'$virtual_id'},
{$sort:{virtual_id:1,_id:1}},
{$skip:2},
{$limit:2}
]);
这基本上是复制数据集,将其附加到末尾,然后应用跳过和限制操作
步骤如下:
$project
添加了virtual\u id
字段,将数组[1,2]
作为值添加到每个文档中。添加带有静态值的字段的$ifNull
方法是我在中找到的一个不错的技巧virtual\u id
将数据集翻倍$sort
确保两个连接的数据集顺序正确。执行此操作后,\u id
值将为:1、2、3、1、2、3
$skip
和$limit
执行明显的操作\u id
之外的任何其他字段,则应在$project
操作中指定它们(默认情况下检索\u id
)。例如,要获取输出中的extra\u字段
和另一个\u字段
的值,请执行以下操作:
$project:{
虚拟_id:{$ifNull:[null[1,2]]},
额外字段:1,
然而,另一个领域:1
}
附注2
此解决方案可能不适用于非常大的数据集,因为:
- 聚合框架的输出在大小上是有限的(我相信是16MB)
操作可能代价高昂,因为无法定义任何索引来覆盖$sort
虚拟\u id
跳过(2)
跳过前两个文档,这样您就不会在结果中看到id为2的文档了吗?您是否询问如何跳过id为2的文档(如果是这样,$ne
)。或者,您是在问如何以编程方式跳过最小数量,以便返回的文档数正好达到限制?(虽然在后一种情况下,不能保证你会得到3和1。)不清楚你在问什么。@RayToal他想在跳过后拿走两个项目,如果没有足够的东西,就从头开始。因此,标题是:圆圈queryYes,如果没有足够的剩余空间,我想从一开始就继续,我认为在OP所示的具体案例中,这是正确的。但是,如果集合中有6个元素,并且他确实跳过了(5),那么他希望ID6和ID1是returned@w0lf:在这种情况下,skip(5)将跳过前5个文档,并且只返回Id 6。我正在描述OP想要什么;不是实际结果。如果我需要更多文档,我需要执行2个请求?
{ "_id" : 3 }
{ "_id" : 1 }