Node.Js本机驱动程序是否能保证MongoDb更新操作符的顺序?

Gab*_*vay 2 mongodb node.js mongodb-query

考虑以下使用Node.JS驱动程序执行的MongoDb更新:

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

是否可以保证$unset$set执行,然后再执行?考虑到这一点,从理论上讲,不应依赖javascript对象键的顺序。这也假设MongoDb本身保证了更新运算符的顺序(为此,我问了这个问题

Nei*_*unn 5

没有这些操作没有命令。实际上,如果尝试这样做将导致您无法修改同一语句中具有相同路径的项,那么您将得到一些错误。所以你不能$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`
});
Run Code Online (Sandbox Code Playgroud)

因此,这实际上不是一个操作,但是有序操作将它带到了与服务器的单次往返所能达到的程度。