使用Mongo的聚合管道,可以使用$out
阶段将查询结果写入集合(现有的或新的),就像那样
db.my_collection.aggregate([ { $match: { my_field: 'my_value' } }, { $out: 'my_new_collection' } ])
问题是Mongo在写my_new_collection
时使用了什么样的锁?它是一个“常规”写锁,还是一个全局锁,比如Map Reduce?
答案 0 :(得分:4)
始终存在一定程度的锁定,这取决于您的MongoDB版本可能是集合,也可能是较旧的数据库级别,甚至可能是WiredTiger存储引擎的文档级别。然而,$out
确实会在写入时产生,因此从管道输出单个文档而不是一次性输出,因此每个更新都是每个文档的原子。
甚至mapReduce命令has this option,您可以在其中设置" nonAtomic"作为mapReduce的输出集合将表现出相同行为的条件。
使用$out
时要注意的一件事就是删除集合中的所有文档(不替换任何现有索引),因为该阶段在使用" replace"时执行模式。所以试图从&#34取代"的集合中读取或写入在聚合操作正在进行时,set很可能会失败(或产生意外结果)。
文档中列出了与分片集合和上限集合相关的其他限制。