Mongo聚合框架:最后阶段$ out操作的锁定级别是什么?

时间:2015-08-05 14:43:39

标签: mongodb aggregation-framework

使用Mongo的聚合管道,可以使用$out阶段将查询结果写入集合(现有的或新的),就像那样

db.my_collection.aggregate([ { $match: { my_field: 'my_value' } }, { $out: 'my_new_collection' } ])

问题是Mongo在写my_new_collection时使用了什么样的锁?它是一个“常规”写锁,还是一个全局锁,比如Map Reduce?

Map Reduce lock reference

1 个答案:

答案 0 :(得分:4)

始终存在一定程度的锁定,这取决于您的MongoDB版本可能是集合,也可能是较旧的数据库级别,甚至可能是WiredTiger存储引擎的文档级别。然而,$out确实会在写入时产生,因此从管道输出单个文档而不是一次性输出,因此每个更新都是每个文档的原子。

甚至mapReduce命令has this option,您可以在其中设置" nonAtomic"作为mapReduce的输出集合将表现出相同行为的条件。

使用$out时要注意的一件事就是删除集合中的所有文档(不替换任何现有索引),因为该阶段在使用" replace"时执行模式。所以试图从&#34取代"的集合中读取或写入在聚合操作正在进行时,set很可能会失败(或产生意外结果)。

文档中列出了与分片集合和上限集合相关的其他限制。