很明显,这里的一个明显案例是.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
});
}
);
这比“跳过”与基本查询条件匹配的结果要高效得多。