在Mongo中是否可以像原子操作那样进行检查和设置?我正在预订酒店,如果有免费房间,你可以预订,但如果两个或更多人想同时预订怎么办? Mongo中有什么类似的交易或者解决这个问题的方法吗?
答案 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.runCommand
节db.rooms.findAndModify
是战略性的。 db.runCommand将返回有关文档是否已更新的状态代码,如果返回值是true,这将允许我执行其他工作。 findAndModify只是返回旧文档,除非将new
标志传递到参数列表,它将通过该参数列表返回更新的文档。