2011-08-19 51 views
0

我正在使用REST API,我需要能夠通過MongoDB頁面,從我所瞭解的光標是最好的方式來做到這一點。我可以獲取遊標,但是如何序列化它以將其發送到客戶端?以及服務器在返回時如何反序列化並查詢它?這甚至有可能嗎?如何使用node-mongodb-native遊標在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)); 
           } 
         }); 
       }); 

問候,

回答

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,你應該可以創建一個新的遊標來發布正確的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);});