2013-03-25 51 views
2

我:找到的每个文件执行回调时,猫鼬执行find()方法

​​

如果函数返回1K文件我不得不重复1K倍。

如何添加为每个文档执行的回调?喜欢的东西:

var each = function (e){ 
    return convert (e); 
}; 

Emotion.find (query, "-_id", opts, each, function (error, e){ 
    if (error) return cb (error, 500); 
    cb (null, e); 
}); 

基本上,我需要每一个()的MongoDB的使用:http://mongodb.github.com/node-mongodb-native/api-generated/cursor.html#each


编辑:也许这是可以做到听从流数据的事件,推动该文件到一个数组:

http://mongoosejs.com/docs/api.html#query_Query-stream

回答

3

正如我说,流:

var emotions = []; 

Emotion.find (query, "-_id", opts).stream() 
     .on ("error", function (error){ 
      cb (error, 500); 
     }) 
     .on ("data", function (doc){ 
      emotions.push (convert (doc)); 
     }) 
     .on ("close", function(){ 
      cb (null, emotions) 
     }); 

编辑:将上述溶液是比这慢得多:

var emotions = []; 

//Get the collection... then: 

collection.find (query, opts, function (error, cursor){ 
    if (error) return cb (error, 500); 

    cursor.each (function (error, doc){ 
     if (error) return cb (error, 500); 
     if (!doc) return cb (null, emotions); 
     emotions.push (convert (doc)); 
    }); 
}); 
+0

这是你所需要的? – shelman 2013-03-25 15:34:51

+0

是的,但我注意到这比使用mongodb中的每个()慢得多 – 2013-03-25 15:41:53

+1

在这种情况下,您可以从Mongoose中下载到本地驱动程序中,如[this]中所述(http:// stackoverflow.com/questions/10519432/how-to-do-raw-mongodb-operations-in-mongoose)问题。 – shelman 2013-03-25 15:46:58

1

好像你也许能够使用query stream做你想要的东西 -^h无论如何,即使有一个调用,你仍然基本上遍历所有返回的文档,只需要一点点语法糖。

0

为猫鼬/ eachAsync简单示例代码,可以是有用的对于这种情况:

functionProcess = (callback) => { 

    userModel.find().cursor().eachAsync(user => { 
    return user.save().exec();  // Need promise 
    }).then(callback);  //Final loop 

}