如何使用node-mongodb-native游标在Mongodb中进行分页?

时间:2011-08-19 18:32:21

标签: mongodb node.js mongoose

我正在研究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)); 
                                } 
                        }); 
                });

此致

1 个答案:

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