8

MongoDB から一度に 5 つのデータを取得したい

limitを使用して、返されるレコードの数を制限しています

router.post('/List', function (req, res) {
    var db = req.db;
    var collection = db.get('clnName');
    collection.find({}, { limit: 5 * req.body.requestCount }, function (e, docs) {
        res.json(docs);
    });
});

ここでは、クライアントからrequestCount変数をインクリメントして、5 の倍数でデータを取得します。達成したいのは、最初のリクエストで最初の 5 つのデータを取得し、2 番目のリクエストで次の 5 つのデータを取得することですが、何が起こっているのか、私は最初の 5 データを取得し、次に最初の 10 データを取得します。

必要なものを達成するには、どのような変更を加える必要がありますか?

モンゴカーソルメソッドでバッチサイズを使用すると問題が解決しますか?

4

1 に答える 1

10

ここで明らかなのは、データの「ページング」を実装するために.skip()修飾子として使用することです。.limit()

    collection.find({}, { "limit": 5, "skip": 5 * req.body.requestCount  }, function 

ただし、バッチで処理するだけの場合は、既に見た範囲を除外してください。この_idフィールドは、他の並べ替えなしで、これに対する適切な識別子になります。したがって、最初のリクエストで:

var lastSeen = null;
    collection.find(
        {}, 
        { "limit": 5, "sort": { "_id": 1}  },
        function(err,docs) {
           docs.forEach(function(doc) {
               // do something
               lastSeen = doc._id;        // keep the _id
           });
        }
    );

次回は、その「lastSeen」をセッション変数 (またはバッチを処理するだけの他のループ構造) のようなものに格納した後:

    collection.find(
        { "_id": { "$gt": lastSeen }, 
        { "limit": 5, "sort": { "_id": 1}  },
        function(err,docs) {
           docs.forEach(function(doc) {
               // do something
               lastSeen = doc._id;        // keep the _id
           });
        }
    );

そのため、最後に表示された値よりも小さいすべての結果を除外します_id

_id他の並べ替えでもこれは可能ですが、最後に表示された値と最後に並べ替えられた値の両方に注意する必要があります。また_id、最後の値の変更以降、見たものをリストとして保持します。

    var lastSeenIds = [],
        lastSeenValue = null;    

    collection.find(
        {}, 
        { "limit": 5, "sort": { "other": 1, "_id": 1 }  },
        function(err,docs) {
           docs.forEach(function(doc) {
               // do something
               if ( lastSeenValue != doc.other ) {  // clear on change
                   lastSeenValue = doc.other;
                   lastSeenIds = [];
               }
               lastSeenIds.push(doc._id);     // keep a list
           });
        }
    );

次に、変数を配置した次の反復で:

    collection.find(
        { "_id": { "$nin": lastSeenIds }, "other": { "$gte": lastSeenValue } },
        { "limit": 5, "sort": { "other": 1, "_id": 1 }  },
        function(err,docs) {
           docs.forEach(function(doc) {
               // do something
               if ( lastSeenValue != doc.other ) {  // clear on change
                   lastSeenValue = doc.other;
                   lastSeenIds = [];
               }
               lastSeenIds.push(doc._id);     // keep a list
           });
        }
    );

これは、基本的なクエリ条件に一致する結果を「スキップ」するよりもはるかに効率的です。

于 2015-08-05T08:24:45.587 に答える