【问题标题】:MongoDB Cursor - Efficient way to count AND enumerate documents (in Node)MongoDB Cursor - 计数和枚举文档的有效方法(在节点中)
【发布时间】: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
     });
}

【问题讨论】:

    标签: node.js mongodb


    【解决方案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 中运行的。节点驱动程序的工作方式似乎略有不同,我不确定这种方法是否适用于节点驱动程序和回调等。
    猜你喜欢
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 2017-06-13
    • 2018-03-29
    • 1970-01-01
    相关资源
    最近更新 更多