我有:
Emotion.find (query, "-_id", opts, function (error, e){
if (error) return cb (error, 500);
for (var i=0, len=e.length; i<len; i++){
e[i] = convert (e[i]);
}
cb (null, e);
});
如果函数返回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中的each():http://mongodb.github.com/node-mongodb-native/api-generated/cursor.html#each
编辑:也许这可以通过从流中侦听数据事件并将文档推送到数组来完成:
答案 0 :(得分:4)
正如我所说,有了溪流:
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));
});
});
答案 1 :(得分:1)
您似乎可以使用query stream来执行您想要的操作 - 但是,即使使用each()
类型的调用,您仍然基本上迭代所有返回的文档,只是用一点点语法糖。
答案 2 :(得分:1)
mongoose / eachAsync的简单示例代码,对于这种情况可能很有用:
functionProcess = (callback) => {
userModel.find().cursor().eachAsync(user => {
return user.save().exec(); // Need promise
}).then(callback); //Final loop
}