当前位置: 首页 > 知识库问答 >
问题:

Mongo循环查询

楚骞尧
2023-03-14

我可以运行查询以获取文档的确切数量吗?

我有收藏:


    > db.circle.find()
    { "_id" : 1 }
    { "_id" : 2 }
    { "_id" : 3 }

执行查询:


    > db.circle.find().skip(2).limit(2)
    { "_id" : 3 }

回应1份文件,但我需要2份

看到这种反应的最佳方式是什么?


    { "_id" : 3 }
    { "_id" : 1 }

共有3个答案

卫浩瀚
2023-03-14

我用了db.collection.count()

文件:

db.collection.count()

返回与find()查询匹配的文档数。db。收集count()方法不执行find()操作,而是计算并返回与查询匹配的结果数。

鄂曦之
2023-03-14
The cursor.skip() method is often expensive because it requires the server to walk from 
the beginning of the collection or index to get the offset or skip position before 
beginning to return result

SO在您的代码db.circle.find(). ski(2). limited(2)中,它将跳过前两个文档,并返回下一个2。有关更多详细信息,请参阅cursor.skip()

如果要跳过具有特定ID的文档,请使用$ne运算符

 db.circle.find({"_id":{ "$ne" : 2}})

它将返回您以下文件:

{ "_id" : 3 }
{ "_id" : 1 }
於子晋
2023-03-14

我找到了一种使用聚合框架在一个查询中解决这个问题的方法:

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 }   
]);

这基本上是创建数据集的副本,将其追加到末尾,然后应用跳过

步骤如下:

>

$通过展开virtual_id使数据集加倍。

$sort确保两个连接的数据集顺序正确。执行此操作后,\u id值将为:1,2,3,1,2,3

$skip$limit做显而易见的事情

如果需要检索除\u id之外的任何其他字段,则应在$project操作中指定它们(默认情况下检索\u id)。例如,要获取输出中的extra_字段另一个_字段的值,请执行以下操作:

        $project: {
            virtual_id: { $ifNull: [null, [1, 2]] },
            extra_field: 1,
            yet_another_field: 1
        }

此解决方案可能不适用于非常大的数据集,因为:

  • 聚合框架的输出大小有限(我相信是16MB)
  • $sort操作可能很昂贵,因为无法定义任何索引来覆盖虚拟_id
 类似资料:
  • 我有一个简单的查询循环,它在大约93分钟内处理了96,945个文档中的44,000个文档后获得一个MongoCursorNotFoundException。 “做一些事情”部分需要一段时间,这就是为什么整个循环需要这么长时间的原因。 我的问题是,在处理集合中可能一半的文档后,我会得到这个异常。 我正在Windows10笔记本电脑上本地运行客户端应用程序和mongod服务器,通过localhost访

  • 问题内容: 该表表示类别层次结构,层次结构顶部的元素的父ID为NULL。该表如下所示: 我正在尝试做的是建立一个SQL查询,这将使我返回: 任何给定[categoryId]的[categoryId],[categoryName]链。它应该循环并获取每一行,直到到达具有parentId == NULL的行为止。 如上面的示例示例234-> 91-> 35-> 20-> 1-> NULL(STOP)

  • 您好,我对jquery没有什么问题。首先,我有: 大众BORA 1.9TDI 1990 1995 奥迪A3 2.0TFSI 2006 2008 但我想实现: VW BORA 1.9TDI 1990 VW BORA 1.9TDI 1991 VW BORA 1.9TDI 1992 VW BORA 1.9TDI 1993 VW BORA 1.9TDI 1994 VW BORA 1.9TDI 1995 A

  • 我试图创建一个可以识别父子循环的函数<想象 对象A是对象B的父对象 对象B是对象C的父对象 创建一个可以防止父子循环的函数。该函数应该给出至少两个参数(ChilName、家长名),如果关系创建了一个循环,则会出错。在上面的例子中,如果我们通过(A、C)应该打印或传递字符串: “A是C的父级” 我知道如何创建这个函数(你可以用任何语言提供答案): 我的主要问题是如何在异常中提供正确的消息。(“A是C

  • 问题内容: 我第一次不了解PHP。我一直在脚本中使用for循环,while循环,foreach循环。我想知道 哪一个性能更好? 选择循环的标准是什么? 当我们在另一个循环中循环时应该使用哪个? 我一直想知道要使用哪个循环的代码。 很明显,我可以使用while编写上面的代码。希望有人能帮助我找出哪个循环更适合使用。 问题答案: 哪一个性能更好? 没关系 选择循环的标准是什么? 如果只需要遍历对象或数

  • 通常你想在一个任务中干很多事,比如创建一群用户,安装很多包,或者重复一个轮询步骤直到收到某个特定结果. 本章将对在playbook中如何使用循环做全面的介绍. Topics 循环 为了保持简洁,重复的任务可以用以下简写的方式: - name: add several users user: name={{ item }} state=present groups=wheel with_it