2012-08-30 15 views
8

所以。我有一個非常基本的腳本,它連接到一個數據庫,並在包含大量文檔的集合上執行find並將其限制爲3個項目。除了在我的結果結尾處,一切都運行平穩,一個null和腳本不會終止,而不是在成功完成後悄然關閉連接。node-mongodb-native - 遊標在每次調用期間返回null作爲最後一個值

在這裏我聲明我的PARAMS和創建我的數據庫對象:

var SERVER = 'localhost', 
PORT = 27017, 
DATABASE = 'test', 
COLLECTION = 'coll', 
mongo = require('mongodb'), 
db = new mongo.Db(DATABASE, 
    new mongo.Server(SERVER, PORT, {auto_reconnect: true}), 
    {}); 

在這裏,我連接到數據庫,並進行了find光標和each功能進行查詢:

db.open(function(err, db) { 
if(err) throw err; 
var collection = new mongo.Collection(db, COLLECTION), 
    cursor = collection.find({}, {}).limit(3); 
cursor.each(function(err, doc) { 
    if(err) throw err; 
    console.log(doc); 
}); 
db.close(); 
}); 

結果很不錯:

{ _id: '1', 
    a: 'first object' } 
{ _id: '2', 
    a: 'second object' } 
{ _id: '3', 
    a: 'third object' } 

直到出現

null 

出現。

如上所述,腳本然後繼續不終止。

我不明白爲什麼,並會很高興指示如何使它很好地終止。

回答

7

那麼,那是愚蠢的。在異步設置中沒有編程的時間過長,並且出現錯誤:db.close()調用在each循環結束之前發生。返回null並因此掛機。這裏是正確的代碼:

db.open(function(err, db) { 
if(err) throw err; 
var collection = new mongo.Collection(db, COLLECTION), 
    cursor = collection.find({}, {}).limit(3); 
cursor.each(function(err, doc) { 
    if(err) throw err; 
    if(doc !== null) console.log(doc); 
    else db.close(); 
}); 
}); 

我希望它可以節省一些分鐘給某人,不知何故。

10

這個問題已經有幾年了,已經有了一個可能的答案,但我只想指出另一種可能性,對於任何讀完這些後仍然感到困惑的人。事實證明,each反覆調用nextObject,實際上當遊標耗盡時它將返回null。這裏

的答案是我需要的一個:Node Mongo Native - how to tell when a cursor is exhausted?

從節點MongoDB的驅動程序文檔:http://mongodb.github.io/node-mongodb-native/api-generated/cursor.html#nextobject

+1

這應該是實際的答案。 – Julian

+0

甚至,在調用cursor.each期間,我得到一個null作爲最後一個值。 nodejs版本:0.12.9,mongodb ddriver版本:^ 2.2.33。很好,我看到了這個答案。 –

相關問題