考虑到以下使用node.js驱动程序执行的MongoDB更新:

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

是否有任何保证可以先执行$unset然后再执行$set?这是因为理论上不应该依赖javascript对象的键的顺序。这也假设MongoDB本身保证了更新操作符的顺序(对于我已经要求的this question

最佳答案

不,这些操作没有命令。事实上,如果您尝试告诉您不能用相同的路径修改同一语句中的项,您将得到一些错误。因此,不能在同一个update语句中$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`
});

因此,这实际上不是一个操作,但有序操作使它尽可能接近您可以通过一次往返到服务器。

10-08 19:54