如何在mongodb中批量获取数据

时间:2015-08-05 08:04:33

标签: mongodb mongodb-query monk

我想一次从MongoDB中检索数据

我使用限制限制返回的记录数

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会解决我的问题吗?

1 个答案:

答案 0 :(得分:5)

这里显而易见的一个明显的例子就是使用.limit()作为修饰符和 collection.find({}, { "limit": 5, "skip": 5 * req.body.requestCount }, function 来实现" paging"数据:

_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 }); } ); 字段为此提供了一个很好的标识符,而无需其他排序。所以在第一次请求时:

    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
           });
        }
    );

然后在下一次存储" lastSeen"像会话变量(或其他只处理批处理的循环结构):

_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
           });
        }
    );

然后在你的下一次迭代中使用变量:

new

这比"跳过"更有效率。通过与基本查询条件匹配的结果。