MongoDB的更新原子性是否适用于查询和修改?

Dav*_*ots 7 mongodb

MongoDB支持原子更新.即我可以肯定,当文档更新时,没有其他更新会覆盖我之前的更改.我的问题涉及查询和更新语句的组合,最好通过下面的示例说明.

db.foo.update(
{ state : 1, players: { $size: 2 } } , 
{ $push: { players : { new player document } } }, 
false , true );
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我只想将一个新玩家推入一个玩家集合,如果玩家数量等于2.鉴于上述查询和更新声明,两个同步更新是否可能将玩家推送到同一个文档,因为在阅读文件时其玩家的大小是2?即整个查询的原子性跨度和更新部分更新语句?

编辑更深入的事件序列:

考虑同时触发相同的更新两次(U1和U2).以下事件顺序是否可能?

  1. U1发现文档#1与更新语句的查询部分匹配.
  2. U2发现文档#1与更新语句的查询部分匹配.
  3. U1在文档#1中推送了一个新玩家.
  4. U2在文档#1中推出了一个新玩家.

最终结果是文档#1包含的玩家多于预期,因为U1和U2都认为文档#1只包含两个玩家.

Dav*_*ots 4

我在 mongodb-user 组上问过这个问题。http://groups.google.com/group/mongodb-user/browse_thread/thread/e61e220dc0f6f64c

根据Marc(在10gen工作)的回答,我描述的情况不可能发生。

你所描述的情况是不可能的;不存在两次更新修改同一文档的危险。