ここで明らかなのは、データの「ページング」を実装するために.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
});
}
);
これは、基本的なクエリ条件に一致する結果を「スキップ」するよりもはるかに効率的です。