2013-07-14 108 views
2

我需要插入MongoDB中的一些矩陣,所以我寫了簡單的下面的代碼MongoDB中不保存所有數據

var MongoClient = require('mongodb').MongoClient;  
var matrisMaker = function(d1,d2){ 
    var result = new Array(); 
    for (var i = 0;i < d1;i++){ 
     result.push(new Array()); 
     for (var k = 0;k < d2;k++){ 
      result[i].push(Math.round(Math.random() * 1000000000000)); 
     } 
    } 
    return result; 
}; 

    MongoClient.connect('mongodb://127.0.0.1:27017/test', function(err, db) { 
    if(err) throw err; 

    var collection = db.collection('matris'); 

    for (var counter = 0;counter < 10000000;counter++){ 
     var insertObject = { 
       'matrisA':matrisMaker(20,20), 
       'matrisB':matrisMaker(20,20), 
       'resultA':new Object(), 
       'resultB':new Object() 
     }; 
     collection.insert(insertObject, function(err, docs) { 
      if (err) 
       throw err; 
     }); 
     delete insertObject; 
     if ((counter % 1000) == 0) 
      console.log(counter); 
    } 
    db.close(); 
    }) 

當我看到記錄它打印出的太多記錄插入,像50000,但是當我使用mongodb來記錄記錄數量,它顯示較少,大約有1,000條記錄。

>use test; 
>db.matris.count(); 

問題在哪裏?

回答

3

您的異步代碼存在缺陷,並且您的db.close()行在您的異步insert命令全部完成之前執行。您需要控制程序的流向:A)沒有100萬個併發數據庫插入發生/排隊,並且B)等待它們在關閉連接之前全部由mongo處理。考慮一個幫助程序庫,如async.forEach以幫助解決這個問題,如果你不想自己編寫代碼。

+1

+1教導我連接必須在每次操作後關閉,而不是在程序結束前才能發佈我的答案。這可能是相關的:[Node.js代碼加載不一致MongoDB](http://stackoverflow.com/questions/12569830/node-js-code-loading-inconsistently-to-mongodb?rq=1) – havarc

+0

@havarc - - 這不是彼得所建議的。在工作完成之前,您的代碼錯誤地關閉了連接(因爲插入的調用是異步的。 – WiredPrairie