2017-06-16 63 views
0

所以實際上我做了一個在文檔中插入超過10000條記錄的腳本。所以我做了什麼,首先我使用insertMany查詢將10000條記錄插入到我的集合中。但是當我再次嘗試插入相同數量的記錄時,它不會被插入到我的文檔中。然後我嘗試了5000條記錄,但這些記錄也沒有插入。無法在monogDB中插入10000條帶insertMany的記錄

那麼這裏有什麼問題? MongoDB是否有記錄限制?請幫助我。

這裏是我的腳本:

var resultArr=[]; 
    var getUID = function() { 
    return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1); 
    } 
    var date = new Date();  
    date.setDate(date.getDate() + 12);  

    for(var i=0;i<10000;i++){ 
     resultObj = { 
      "guid" : (getUID() + getUID() + "-" + getUID() + "-4" + getUID().substr(0, 3) + "-" + getUID()), 
      title: 'something' 
      } 
      resultArr.push(resultObj); 
      resultObj={}; 
     } 

    db.getCollection('5891847dc654e8e2150b3bff').insertMany(resultArr, function (err, result) { 
     print('data saved') 
     if (err) { 
      deferred.reject(err) 
      db.close() 
     }; 
    }); 
+0

定義「沒有插入」。這是什麼意思,_exactly_?它只是默默地失敗,或者你得到某種錯誤? –

+0

不,沒有錯誤,而且我只能插入100條記錄和insertMany後綴 –

+1

你不會首先使用底層的['.bulkWrite()'](https://docs.mongodb.com/manual/reference/method/db.collection.bulkWrite/),然後將其分解爲1000個批次。因爲底層無論如何,司機都會這樣做。如果您將10,000個文檔加載到內存中並嘗試運行插入,則還有其他問題需要處理。總之,除非你顯示你的代碼,否則我們不能真正處理你的問題。 –

回答

0

使用下面的代碼來代替:

var async = require('async'); 

    var resultArr = []; 
    var getUID = function() { 
    return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1); 
    } 
    var date = new Date();  
    date.setDate(date.getDate() + 12);  

    var count = 0; 
    async.whilst(
    // Check to see if we continue 
    function() { return count < 10000 }, 
    // The loop function 
    function(callback) { 
     count++; 
     resultArr.push({ 
     "guid" : (getUID() + getUID() + "-" + getUID() + "-4" + getUID().substr(0, 3) + "-" + getUID()), 
     "title": "something" 
     }); 
     if (resultArray.length >= 1000) { 
     db.getCollection('5891847dc654e8e2150b3bff').bulkWrite(
      resultArray.map(function(d) { 
      return { "insertOne": { "document": d } } 
      }), 
      function(err,res) { 
      resultArray = []; 
      callback(err); 
      } 
     ); 
     } else { 
     callback() 
     } 
    }, 
    // This is on completion or error 
    function(err, n) { 
     if (err) throw err; 
     if (resultArray.length > 0) { 
     db.getCollection('5891847dc654e8e2150b3bff').bulkWrite(
      resultArray.map(function(d) { return { 
      "insertOne": { "document": d } 
      }), 
      function(err,res) { 
      resultArray = []; 
      db.close(); 
      } 
     ); 
     } else { 
     db.close(); 
     } 
    } 
    ); 

這分裂了與async.whilst內異步調用的流量控制迴路。這樣可以調用callback以繼續執行「循環」,因此不會在具有併發運行操作的節點上放棄調用堆棧。

實際的.bulkWrite()調用是在循環內進行的,當數組中的項數達到1000時,這是驅動程序一次發送的最大值。你可以做得更多,但我們正在節省記憶,這是關於「甜蜜點」。

在這裏使用回調函數,我們清除數組並調用「循環的回調函數」以允許循環繼續。

最後,當「循環」完成後,您將「典型地檢查是否有任何剩餘未處理的數量爲偶數量1000.在這種情況下,我們知道這是一個整數,但我將它留給顯示如何處理一個真正的名單做。

所以這部分是在最後的回調參數,以當循環完成它滿足async.whilst,我們實際上可以退出。