2015-11-18 78 views
2

我想將幾千條記錄導入流星集合中的嵌套數組。這是以JSON對象形式提供的財務數據。在插入之前我需要對它進行一些計算,所以不能這麼做。爲每個寫入操作執行$ addToSet操作非常非常慢。有沒有辦法在一次調用中推送全套數據?在流星 - 如何做一個嵌套數組批量插入

我的模式看起來像這樣。

NestedSchema = new SimpleSchema({ 
    item: { 
    type: String 
    }, 

    aThing: { 
    type: Number 
    } 
}); 

MasterSchema = new SimpleSchema({ 
    symbol: { 
    type: String, 
    label: 'Symbol', 
    unique: true 
    }, 

    data: { 
    type: [NestedSchema], 
    optional: true 
    } 
}); 

我有一堆這樣的數據,我想插入。

var dataToInsert = [{item: "thing", aThing: 1}, {item: "thing2", aThing: 2}, {item: "thing3", aThing: 2}]; 

我試圖插入到嵌套數組中的數據是5000+條記錄。我已經看過https://atmospherejs.com/udondan/bulk-collection-updatehttps://atmospherejs.com/mikowals/batch-insert,但他們似乎並沒有完全符合我的要求。理想情況下,我會有一個解決方案,可以在收集新散記時批量添加新記錄。

+0

是否使用'$ addToSet'避免受騙者上得到在故宮的MongoDB驅動程序收集和數據庫對象的原始訪問?如果沒有欺騙,那麼只需'推',這應該快得多。或者你可以在內存中創建整個數組,然後一次插入? –

回答

0

可以使用forEach()方法在陣列上和環路內採取使用寫的優點更新集合命令批量的API,允許它們是簡單地在服務器的頂部上以抽象批量更新操作的執行可以輕鬆構建批量操作。這些批量操作主要有兩種口味:

  • 訂購批量操作。這些操作按順序執行所有操作,並在第一次寫入錯誤時出錯。
  • 無序批量操作。這些操作並行執行所有操作並彙總所有錯誤。無序批量操作不保證執行順序。

請注意,對於比2.6更早的服務器,API將下載轉換操作。然而,它不可能下變換100%,因此可能會出現一些無法正確報告正確數字的邊緣情況。您可以通過rawCollectionrawDatabase方法Mongo.Collection

MyCollection = new Meteor.Collection("mycollection"); 

if (Meteor.isServer) { 
    Meteor.startup(function() { 
     Meteor.methods({ 
      insertData: function(symbol) { 
       var bulkOp = MyCollection.rawCollection().initializeUnorderedBulkOp(), 
        counter = 0, 
        dataToInsert = [...]; 

       dataToInsert.forEach(function(data) { 

        bulkOp.find({"symbol": symbol}).updateOne({ "$addToSet": data }); 

        counter++; 
        if (counter % 1000 == 0) { 
         // Execute per 1000 operations and re-initialize every 1000 update statements 
         bulkOp.execute(function(e, result) { 
          // do something with result 
          console.info('result.nMatched', result.nMatched, 'result.nModified', result.nModified); 
         }); 
         bulkOp = MyCollection.rawCollection().initializeUnorderedBulkOp(); 
        } 
       }); 

       // Clean up queues 
       if (counter % 1000 != 0){ 
        bulkOp.execute(function(e, result) { 
         // do something with result 
        }); 
       } 
      } 
     }); 
    }); 
} 
+1

這工作完美!謝謝。很高興知道。 – cspecter

+0

@ user3225576不用擔心,樂意幫忙:) – chridam