mongodb 是否使用原子查询进行更新?

Is mongodb update with query atomic?

mongodb 写入和更新操作是原子的,如 docs.

中所述

但是它在使用查询时也是原子的吗?

例如:

db.collection.update( { id : 1 , count : 0 } , { $inc : { count : 1 } } )

如果我在多线程环境下执行这个操作,是否有可能某个时候id等于1的文档中count的值会大于1?

对单个文档的任何修改都是原子的。

使用您的示例,假设有两个线程尝试使用相同的查询更新该文档:

Thread A: db.collection.update({_id: 1, count: 0}, {$inc: {count: 1}})
Thread B: db.collection.update({_id: 1, count: 0}, {$inc: {count: 1}})

包含文档的集合:

collection: {_id: 1, count: 0}

如果线程 A 设法在线程 B 之前更新文档,则集合将包含:

collection: {_id: 1, count: 1}

线程 B 将搜索与 _id:1, count:0 匹配的文档,但由于该文档已被线程 A 修改,线程 B 中的更新将不会继续(因为文档不再 "exists" 作为线程 B 关注)。

换句话说,线程A将returnnMatched: 1, nModified: 1,而线程B将returnnMatched: 0, nModified: 0.

具体回答你的问题,不会有文档{_id: 1, count: 2}存在的情况。