2013-11-03 31 views
2

MongoDB的支持批量插入http://docs.mongodb.org/manual/core/bulk-inserts/散裝的MongoDB插入或節點

我在流星收集試了一下:

Orders.insert([ 
    { "cust_id" : "A123", "amount" : 500, "status" : "A", "_id" : "iZXL7ewBDALpic8Fj" }, 
    { "cust_id" : "A123", "amount" : 250, "status" : "A", "_id" : "zNrdBAxxeNZQ2yrL9" }, 
    { "cust_id" : "B212", "amount" : 200, "status" : "A", "_id" : "vev3pjJ8cmiDHHxe4" }, 
    { "cust_id" : "A123", "amount" : 300, "status" : "D", "_id" : "BBLngRhS76DgeHJQJ" } 
]); 

但它只是創建

{ "0" : { "cust_id" : "A123", "amount" : 500, "status" : "A", "_id" : "iZXL7ewBDALpic8Fj"}, 
"1" : { "cust_id" : "A123", "amount" : 250, "status" : "A", "_id" : "zNrdBAxxeNZQ2yrL9" }, 
"2" : { "cust_id" : "B212", "amount" : 200, "status" : "A", "_id" : "vev3pjJ8cmiDHHxe4" }, 
"3" : { "cust_id" : "A123", "amount" : 300, "status" : "D", "_id" : "BBLngRhS76DgeHJQJ" }, 
"_id" : "6zWayeGtQCdfS65Tz" } 

我需要它的性能測試目的。我需要用數千個測試項目來填充和測試數據庫。我在foreach中插入,但填充數據庫需要很長時間。

這裏有任何解決方法嗎?或者我們可以預計Meteor將在下一個版本中支持這個功能嗎?

+0

,如果它的時間太長,你可以從foreach循環並行每個發送文件運行多個客戶端 - 它應該接近客戶端進程的數量的一個因素加速這一過程。 –

+0

請參閱我的答案[爲什麼要加載數據到流星體集合採取這麼長](http://stackoverflow.com/questions/19549337/why-does-loading-data-into -a-流星收集走那麼長/)。 –

回答

4

您可以使用exec(nodejs docs)在服務器上的Meteor.startup內運行流星內部的mongo腳本。

例子:

Meteor.startup(function() { 
    var exec = Npm.require('child_process').exec; 
    exec('mongo localhost:27017/meteor path-to/my-insert-script.js', function () { 
     // done 
    });   
}); 

不是最優的,但我認爲這是你最好的選擇現在。您還可以在exec中使用命令行選項--eval針對Mongo,並將插入語句作爲字符串傳遞給exec。這可能是這樣的:

Meteor.startup(function() { 
    var exec = Npm.require('child_process').exec; 
    exec('mongo localhost:27017/meteor --eval \'db.Orders.insert(' + JSON.stringify(arrOfOrders) + ')\'', function () { 
     // done 
    });   
}); 
+0

謝謝,我已經使用了第二個變體。但是雙引號必須是單引號,因爲JSON.stringyfy()會添加雙引號並導致'SyntaxError:意外的輸入結束'。 –

+0

很高興我能幫到你。我還沒有測試任何解決方案。我會更新我的答案,使其在語法上更加正確。 – Dave

+0

考慮使用mongoimport:http://stackoverflow.com/questions/15365747/how-to-use-mongoimport-with-my-meteor-application-database – Reimund

3

在向數據庫中插入大量數據時(例如在forEach循環中),您需要確保頁面上沒有任何依賴於它的反應性內容。否則,被動的重組將會極大地降低你的客戶。當禁用所有模板時,您可以輕鬆地在幾秒鐘內將幾千個文檔插入到集合中,而如果發生相關反應,則在客戶端和服務器上,相同的操作可能需要幾分鐘時間才能使CPU達到100%。

您可能需要一個條件添加到其內容依賴於這個數據,如任何模板:

Template.myTemplate.items = function() { 
    if (Session.get("active")) { 
     return Order.find(); 
    } 
} 

那麼您可以在forEach循環之前關閉所有的反應重新渲染,之後再重新激活它(Session.set (「主動」,錯誤))。

+0

這可能有所幫助,但我不想重寫每個模板。 –