0

MongoDB にこのコレクションがあります (_id簡潔にするために s を省略しています)。

test> db.entries.find();
{
  "val": 1
}
{
  "val": 2
}
{
  "val": 3
}
{
  "val": 4
}
{
  "val": 5
}

ではできない処理を各ドキュメントに対して実行する必要がありますdb.update()。要するに、私がする必要があるのは、一度に 1 つのドキュメントを取得し、Node で処理してから Mongo に保存することです。

私は Monk ライブラリを使用しており、プロミスには Q を使用しています。これが私がやったことです - 簡潔にするために処理/保存ビットを含めませんでした:

var q = require('q');

var db = require('monk')('localhost/test');
var entries = db.get('entries');

var i = 1;
var total;

var f = function (entry) {
    console.log('i = ' + i);
    console.log(entry.val);
    i++;
    if (i <= total) {
        var promise = entries.findOne({ val: i });
        loop.then(function (p) {
            return f(p);
        });
        return promise;
    }
};

var loop = q.fcall(function () {

    return entries.count({});

}).then(function (r) {

    total = r;
    return entries.findOne({ val: i });

}).then(f);

このコードが出力されると思います:

i = 1
1
i = 2
2
i = 3
3
i = 4
4
i = 5
5

しかし、実際には次のように出力されます。

i = 1
1
i = 2
2
i = 3
2
i = 4
2
i = 5
2

私は何を間違っていますか?

4

1 に答える 1