2

私は持っています:

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

4

3 に答える 3

5

私が言ったように、ストリームで:

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));
    });
});
于 2013-03-25T15:17:40.103 に答える
1

クエリストリームを使用して必要な処理を実行できるようですが、each()ある種の呼び出しを行っても、基本的に、返されたすべてのドキュメントを少しだけ構文糖衣構文で繰り返し処理しています。

于 2013-03-25T15:04:57.707 に答える
1

mongoose / eachAsyncの簡単なサンプルコードは、この場合に役立ちます。

functionProcess = (callback) => {

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

}
于 2017-11-21T11:27:35.250 に答える