Mongodb Mongo循环查询

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() { "_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} 因此,在您的代码中,
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
    执行明显的操作

  • 附注1 如果需要检索除
    \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 }