2017-07-25 35 views
0

在流星服務器端方法,我注入globalPositions對象與key=_id & value=number更新Tasks集合中的所有文檔。蒙戈 - 更新集合中的每個文件從一個對象

globalPositions // {id1: x, id2: y, id3: z…} 

如何使在一個時間上的集合中的每個文件,這樣就

Tasks.update({_id: id1}, {$set: {gridIndex: x}}); 

編輯

我找到了一種方法的更新,但對於他的速度和別出心裁?該物體可能是相當大的..

Object.keys(globalPositions).map(function(key, index) { 
    var value = globalPositions[key]; 
    Tasks.update({_id: key}, {$set: {gridIndex: value}}); 
}); 
+0

你基本上正在做一個從'globalPositions'到'Tasks'的副本。你的循環更新是正確的,並且沒有一個批量的方法來做這個afaik,因爲每個文檔都會收到一個唯一的值。您還必須考慮如果在此批量更新過程中服務器崩潰會發生什麼情況,因爲您不知道從哪裏離開。 「globalPositions」如何填充? –

+0

@MichelFloyd'globalPositions'從特定客戶端事件的新對象索引(網格中任務的重新排序)一次性填充。然後通過方法調用將其發送到服務器。我完全不知道在更新過程中服務器崩潰的問題:你能告訴我更多嗎? – Ontokrat

+0

Mongo可能*不會在大型更新中崩潰,但除非'gridIndex'在更新之前爲null,否則您將不知道哪些已經被更新。實際上,[bulk.execute](https://docs.mongodb.com/manual/reference/method/Bulk.execute/#Bulk.execute)在您的上下文中可能很有用。這允許您基本上排隊所有更新,然後批量執行它們。 –

回答

0

默認情況下update操作更新單獨的文件(適用於兩個流星和MongoDB)。要更新所有匹配的文件,您需要傳遞參數multi作爲true

根據你的最新情況看起來很簡單,下面的代碼片段應該工作:

Tasks.update({}, {$set: {gridIndex: x}}, {multi: true}) 

說明:保留查詢選擇空白由set運算符來匹配的所有文件,然後更新您希望必填字段,最後通過multi作爲true以確保所有匹配的文檔都將被更新。

+0

但是每個文檔必須更新爲僅屬於他的值(x,或y或z ...)。這就是爲什麼在該對象中,文檔的'_id'是'key'。在你的迴應中,每個文件都會有'gridIndex:x'否? – Ontokrat

+0

在'MongoDB'中,每一個文檔都有不同的'_id'。如果您嘗試匹配'_id:key',它將只匹配一個文檔。如我錯了請糾正我。 –

+0

正確。我的問題是關於只更新一個正確的值的文件,並重復每個文件(循環)。看到我的問題的編輯。每個文檔都必須有自己的'gridIndex值'。它更清楚嗎? – Ontokrat