2014-07-01 12 views
2

考慮用Node.js的驅動程序進行了以下的MongoDB更新:是否使用Node.Js本機驅動程序保證MongoDb更新操作符的順序?

collection.update({ /* query */}, { $unset: { 'gp': 1 }, $set: { 'gp.status': 'AB' }}, function(err) { 
    // ... 
}) 

在那個時候,$unset將首先執行,$set將在後面進行任何保證?這考慮到理論上不應該依賴javascript對象的鍵的順序。這還假定MongoDb本身保證更新操作員的訂單(爲此我詢問了this question

回答

4

沒有這些操作沒有排序。事實上,如果你嘗試這樣做,你會得到一些錯誤,告訴你不能用相同的路徑修改相同語句中的項目。所以你不能在同一個更新語句中使用$unset$set,因爲兩者基本上都試圖對「gp」進行操作。

如果你的MongoDB的版本是2.6或更高版本,你可以做的是使用「批量更新」操作,以儘可能接近做一個原子更新,也保證順序:

var bulk = collection.initializeOrderedBulkOp(); 
bulk.find({ /* query */}).updateOne({ "$unset": { "gp": 1 } }); 
bulk.find({ /* query */}).updateOne({ "$set": { "gp.status": "AB" } }); 
bulk.execute(function(err,result) { 
    // Write concern result for two ops in `result` 
}); 

所以這是不實際一個操作,但是有序的操作將它帶到服務器的單次往返中。

2

您無法定位到與多個運營商更新一樣,同場,但在這種情況下,你不需要,你可以用一個$set替換整個gp場完成它:

collection.update({ /* query */}, {$set: {gp: {status: 'AB'}}, function(err) { 
    // ... 
}) 
相關問題