我想一次从MongoDB检索数据,一次5次
我正在使用限制来限制返回的记录数
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个数据,在第二个请求中获取下5个数据,但是发生的是,我得到前5个数据,然后得到前10个数据。
我应该做出什么改变才能实现自己的需求?
mongo游标方法中使用批处理大小是否可以解决我的问题?
显然,这里很明显的情况是.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
});
}
);
这比“跳过”匹配基本查询条件的结果要有效得多。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句