MongoDB NodeJS Native游标过早关闭

时间:2014-05-28 15:33:30

标签: node.js mongodb database-cursor

我正在对一个光标的每个元素执行一个进程,我的集合有大约600万个文档,整个过程需要长达10个小时,因为我必须一次处理一个配置文件,这是一个有点复杂的过程每一个。

 var cursor = dbMain.collection("profiles").find({});

 var getNext = function(){
      cursor.nextObject(processOne);
 };

 var processOne = function(err, profile){
      if(err){
           console.error("Error loading profile", err);
           getNext();
      } else if(profile == null){
           // process is done, all profiles processed!!!
      } else {
           processProfile(profile)
               .then(function(){
                    getNext();
               })
               .catch(function(errProfile){
                    console.error("Error processing profile", errProfile);
                    getNext();
               });
      }
 };

 var processProfile = function(profile){
      // Complex profile processing and promise resolve when done
 };

 getNext();

问题:当我大约有300,000个配置文件时,我得到null(这意味着光标已经耗尽),因此,只有前300,000个左右被处理。 ¿任何人都知道如何处理它或者我之前得到空路的原因?

3 个答案:

答案 0 :(得分:3)

我似乎找到了原因:

由于它是一个需要长时间存活的游标,因此在查找选项中我必须添加" timeout:false"。

 var cursor = dbMain.collection("profiles").find({}, {timeout : false});

driver documentation默认情况下说它是假的(好吧不是!!),现在我的所有个人资料都被处理了。

答案 1 :(得分:2)

对于在最新的MongoDB驱动程序上偶然发现此驱动程序的任何人,请注意以下几点。如果您在上次.hasNext()通话之后两次致电.next(),则会得到:Error: Cursor is closed

例如:

while(await cursor.hasNext()) {
    await cursor.next();
}

if (await cursor.hasNext()) {} // Error!

if (!cursor.isClosed() && await cursor.hasNext()) {} // Correct way

答案 2 :(得分:0)

我遇到了同样的问题,我通过将光标的每个文档推送到列表上然后返回列表来解决它,如下所示:

const list:any= [];
const cursor= await client.db('insertYourDb').collection('insertYourCollection').find().forEach(function(document) { 
        list.push(document) 
    });
return list;