对mongoose执行find()时找到的每个文档执行回调

时间:2013-03-25 14:48:08

标签: node.js mongodb mongoose

我有:

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


编辑:也许这可以通过从流中侦听数据事件并将文档推送到数组来完成:

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

3 个答案:

答案 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

}