【问题标题】:How to do paging in Mongodb with node-mongodb-native cursor?如何使用 node-mongodb-native 游标在 Mongodb 中进行分页?
【发布时间】:2011-10-30 20:23:53
【问题描述】:

我正在开发一个 REST API,我需要能够通过 MongoDB 进行分页,据我所知,cursor 是最好的方法。我可以获取光标,但是如何将其序列化以将其发送给客户端?当它回来时,服务器将如何反序列化它,并用它查询?这甚至可能吗?

 collection.find({}, function(err, cursor) { 
                        if (err) { console.log("Error in find: " + err); return;} 
                        cursor.each(function(err, item) { 
                                if (err) { throw err;
                                }
                                if (!item) { 
                                        console.log("All done"); 
                                } else { 
                                        console.log(sys.inspect(item)); 
                                } 
                        }); 
                });

问候,

【问题讨论】:

    标签: mongodb node.js mongoose


    【解决方案1】:

    嗨,我也看到了your question in the node-mongodb-native mailing list。我知道你可以serializing query cursors in App Engine 但我不认为你可以在 MongoDb 中做完全类似的事情。在 Bigtable 中,客户端获取的游标是扫描的最后一行的实际键,而在 MongoDb 中,客户端的游标只是一个 64 位数字。从MongoDb documentation on cursor timeouts 来看,不建议为每个用户保留游标,因为每个未完成的游标都会占用数据库内存。

    但如果你出于某种原因仍想使用 MongoDb 游标,我认为可以使用 cursor.js 破解,但我自己没有尝试过。对于客户端来说,游标只不过是一个 64 位的 cursorId,您应该能够创建一个新的 Cursor 来发出正确的OP_GETMORE requests to the server。我认为它看起来像这样(未经测试!):

    var cursorId = cursor.cursorId;
    
    // ...
    var cursor2 = new mongodb.Cursor(db, collection).limit(100);
    cursor2.state = mongodb.Cursor.OPEN;
    cursor2.cursorId = cursorId;
    cursor2.toArray(function(err, results) {console.log(results);});
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-03
      • 2014-09-12
      • 2011-01-04
      • 1970-01-01
      • 2020-09-15
      • 2018-06-26
      • 1970-01-01
      • 2018-09-16
      相关资源
      最近更新 更多