2017-02-26 64 views
0

我無法從調用MongoDB中檢索數據。 調用工作,因爲我可以顯示結果到控制檯,但是當我嘗試將這些結果寫入/複製到外部數組,以便它們可用於我的程序,在調用之外時,我什麼都沒有。 我見過的每一個例子都是在連接循環中工作的。我找不到任何將結果複製到數組(全局或傳入)的示例,連接結束,程序繼續處理外部數組。從MongoDB調用中獲取數據

這裏的大部分示例代碼要麼過於簡單(即連接循環中的console.log),要麼太複雜,以及如何製作快速api路由的示例。我不需要這個,因爲我正在做老式的串行批處理。 我知道Mongo的構建是異步的,但我仍然可以使用它。

MongoClient.connect('mongodb://localhost:27017/Lessons', function (err, db) { 
    assert.equal(err, null); 
    console.log("Connectied to the 'Lessons' database"); 
    var collection = db.collection('students'); 
    collection.find().limit(10).toArray(function(err, docs) { 
     // console.log(docs); 
     array = docs.slice(0); //Cloning array 
     console.log(array); 
     db.close(); 
    }); 
}); 
console.log('database is closed'); 
console.log(array); 

它看起來像我試圖在循環完成之前記錄數據。但如何同步時間? 如果有人能向我解釋這一點,我會非常感激,因爲我一直盯着這個東西好幾天,真的很蠢。

回答

0

從您共享的代碼中,是否希望數組顯示在console.log末尾?這不適用於您當前的設置,因爲最終的2 console.log將在對數據庫的查詢完成之前運行。

您應該使用回調函數來獲取結果。如果你不確定這些是什麼,你需要學習mongo/node在任何地方使用它們。基本上,javascript被設計爲運行速度非常快,並且不會等到完成某些任務才能完成下一行代碼。

本教程幫了我很多,當我第一次學習:https://zellwk.com/blog/crud-express-mongodb/

你能不能讓我們知道什麼樣的環境運行此蒙戈的要求嗎?它會給更多的上下文,因爲現在我不知道你是如何使用mongo的。

0

感謝您的快速響應。

環境是Windows7的在後臺運行,所以我連接到本地主機的mongod的一個實例。我正在使用我創建的數據庫,但您可以使用任何集合來運行示例代碼。

我確實說過我認爲這是一個計時的事情。您的觀察結果「最終的2 console.log將在查詢數據庫完成之前運行」真正爲我解釋了這個問題。

我取代了代碼末,在connect()用下面的代碼後:

function waitasecond(){ 
    console.log(array); 
} 
setTimeout(waitasecond, 2000); 

和陣列是完全填充。這表明,我試圖做的事情,至少我想做的事情是不可能的。我想我有兩個選擇。

  1. 順序處理(因爲我本來concieved) - 我將不得不把某種時間延遲,讓DB調用結束之前開始。

  2. 與該需要做,並在數據庫返回的數據從數據庫裏面回調調用它的處理所有的代碼創建一個函數。

第一個選項有點臭。我不想在製作中看到這個,所以我想我會選擇第二個選項。

感謝您推薦的鏈接。對於我來說,我做了一個快速的觀察,問題在於這是描述了一種非常常見的模式,它依靠快速監聽路由器呼叫來響應。我正在做的處理與路由器呼叫無關。

啊同步io的好日子啊。

+0

您的選擇是正確的。您的不情願與選項1一起完全正確。 – JohnnyHK