node.js - MongoDb 更新操作符的顺序是否由 Node.Js native 驱动程序保证?

标签 node.js mongodb mongodb-query

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

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

是否可以保证先执行 $unset 然后再执行 $set?考虑到理论上不应该依赖 javascript 对象的键的顺序。这还假设 MongoDb 本身保证更新操作符的顺序(为此我已经问过 this question )

最佳答案

不,这些操作没有顺序。事实上,如果您尝试告诉您不能修改具有相同路径的同一语句中的项目,您会得到一些错误。所以你不能$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`
});

所以这实际上不是一个操作,但有序操作使它尽可能接近服务器单次往返。

关于node.js - MongoDb 更新操作符的顺序是否由 Node.Js native 驱动程序保证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24500996/

相关文章:

mongodb-如何在查找方法中显示日期中的年份

node.js - 根据数组字段的子文档_id查找父文档id

javascript - 错误连接 MongoDB : Error: Route. get() 需要一个回调函数,但得到一个 [对象未定义]

windows - 在 Windows 7 上启动 Node 应用程序时出现问题

javascript - NodeJS超测访问 session 对象

node.js - 使用 Backbone、Express 和 Mongoose 支持和反对

MongoDB 德语文本索引

mongodb - 仅检索 MongoDB 集合中对象数组中的查询元素

mongodb - Mongoose 聚合不按输入日期过滤

javascript - 如何修复 CLIENT_MISSING_INTENTS 错误?