如何在mongodb中批量获取数据
how to get data in batches in mongodb
我想从 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 个数据 .
我应该做出什么改变才能达到我的需要?
使用batch size in mongo cursor methods可以解决我的问题吗?
很明显,这里的一个明显案例是使用 .skip()
作为修饰符以及 .limit()
以实现 "paging" 数据:
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
});
}
);
通过匹配基本查询条件的结果,比"skipping"效率高很多
我想从 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 个数据 .
我应该做出什么改变才能达到我的需要?
使用batch size in mongo cursor methods可以解决我的问题吗?
很明显,这里的一个明显案例是使用 .skip()
作为修饰符以及 .limit()
以实现 "paging" 数据:
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
});
}
);
通过匹配基本查询条件的结果,比"skipping"效率高很多