我正在研究REST API,我需要能够通过MongoDB进行分页,从我理解的光标是最好的方法。我可以获取光标,但如何序列化它以将其发送到客户端?以及服务器在返回时如何对其进行反序列化,并用它进行查询?这甚至可能吗?
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));
}
});
});
此致
答案 0 :(得分:2)
嗨,我也看到了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);});