在Mongo的任何方式做检查和设置像原子操作?

时间:2012-08-16 15:59:04

标签: mongodb pymongo

在Mongo中是否可以像原子操作那样进行检查和设置?我正在预订酒店,如果有免费房间,你可以预订,但如果两个或更多人想同时预订怎么办? Mongo中有什么类似的交易或者解决这个问题的方法吗?

3 个答案:

答案 0 :(得分:4)

是的,这是MongoDB的findAndModify命令的经典用例。

专门针对pymongo:find_and_modify

答案 1 :(得分:3)

所有更新都是对文档的原子操作。现在,find_and_modify锁定该文档并在同一操作中将其返回。 这允许您在查找期间对文档进行组合锁定,然后应用更新操作。

您可以找到有关原子操作的更多信息: http://www.mongodb.org/display/DOCS/Atomic+Operations

最好,

诺韦尔托

答案 2 :(得分:0)

答案参考findAndModify文档。但是考虑到OP的要求,一个实际的例子将是公平的:

const current = new ISODate();
const timeAgoBy30Minutes = new Date(current.getTime()  - 1000 * 30 ).toISOString();

db.runCommand(
  {
    findAndModify: "rooms",
    query: {
      "availability" : true,
      "lastChecked" : {
        "$lt": timeAgoBy30Minutes
      }
    },
    update: { $set: { availability: false, lastChecked:  current.toISOString() } }
  }
)

在上面的示例中,我决定使用db.runCommanddb.rooms.findAndModify是战略性的。 db.runCommand将返回有关文档是否已更新的状态代码,如果返回值是true,这将允许我执行其他工作。 findAndModify只是返回旧文档,除非将new标志传递到参数列表,它将通过该参数列表返回更新的文档。