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

szy*_*mek 5 mongodb aggregation-framework

使用Mongo的聚合管道,可以使用$outstage 将查询结果写入集合(现有的或新的)

db.my_collection.aggregate([ { $match: { my_field: 'my_value' } }, { $out: 'my_new_collection' } ])
Run Code Online (Sandbox Code Playgroud)

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

Map减少锁定参考

Bla*_*ven 5

总是有一定程度的锁定,这取决于您的 MongoDB 版本可能是集合或较旧的数据库级别,甚至可能是 WiredTiger 存储引擎的文档级别。该$out但是不产生上写,所以indvidual文件是从管道输出,而不是全部一气呵成,所以每次更新每个文档的原子。

甚至 mapReduce 命令也有这个选项,您可以在其中设置“nonAtomic”作为 mapReduce 的输出集合将表现出相同行为的条件。

需要注意的一件事是$out在使用“替换”模式时执行该阶段时从集合中删除所有文档(而不是替换任何现有索引)。因此,在聚合操作正在进行时,尝试从使用“替换”集定向的集合中读取或写入很可能会失败(或产生意外结果)。

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