MongoDB Cursor - 计数和枚举文档的有效方法(在节点中)

Posted

技术标签:

【中文标题】MongoDB Cursor - 计数和枚举文档的有效方法(在节点中)【英文标题】:MongoDB Cursor - Efficient way to count AND enumerate documents (in Node) 【发布时间】:2015-05-29 12:57:32 【问题描述】:

我想知道在迭代游标之前,我的 MongoDB 游标将处理多少文档。我是否必须运行两次查询,还是可以确定游标的大小,然后在游标上迭代而不运行两次查询?

myCount = myCollection.find(complex query).count(); // will get my count
myCursor = myCollection.find(complex query); // will get my cursor for iteration

但是这两个命令会运行两次查询,估计效率不高吧?

在不运行两次查询的情况下确定要迭代的文档数量的最有效方法是什么?我的文档很大。

在开始通过游标返回文档之前,MongoDB 是否“知道”将返回多少个文档?我在哪里可以阅读有关 Mongo 内部结构的信息?

我在节点中运行它,并且使用标准的 MongoDB 节点驱动程序。因此,解决方案需要处理通常的节点回调机制等。

谢谢

编辑

我已经修改了原来的问题,说明我正在使用节点驱动程序

EDIT2

yogesh 的回答是正确的,我只需要弄清楚 node.js 的语法。我已经在下面展示了工作代码,以防它帮助任何人

db.collection('collectionName', function(err, collection) 
    function processItem(err, item) 
         if (item === null) 
               db.close();
               callback(null, info: "yippee");
               return; 
         
         cursor.nextObject(processItem); // continue looping
     
     var cursor = collection.find(foo:1);
     cursor.count(function(err,count)
         console.log('resultCursor size='+count);
         cursor.nextObject(processItem); // Start of the loop
     );

【问题讨论】:

【参考方案1】:

检查cursor.next 这个db.collection.find() 方法返回的游标中找到下一个文档。所以你的情况应该写成(在 mongo shell 上测试)

var collectionData  = myCollection.find(complex query)
collectionData.count() // return matching documents count 
collectionData.next() // return next documents 

或者您也检查mongo hasnext 如果 db.collection.find() 查询返回的游标可以进一步迭代以返回更多文档,则返回 true。

【讨论】:

抱歉,我应该更具体一点:这是在 node.js 中运行的。节点驱动程序的工作方式似乎略有不同,我不确定这种方法是否适用于节点驱动程序和回调等。

以上是关于MongoDB Cursor - 计数和枚举文档的有效方法(在节点中)的主要内容,如果未能解决你的问题,请参考以下文章

mongodb - 聚合游标计数

如何使用 Node.js 在 MongoDB 中使用 cursor.forEach()?

如何使用 Node.js 在 MongoDB 中使用 cursor.forEach()?

Mongodb Cursor,如何遍历巨大的集合?

MongoDB $reduce(aggregation) 组与数组中嵌套文档的总和并按组计数

如何根据 MongoDB 中的列表计数过滤文档? [复制]