【问题标题】:Mongo aggregation framework: what is the lock level of the last stage $out operation?Mongodb聚合框架:最后阶段$out操作的锁级别是多少?
【发布时间】:2015-08-05 23:54:41
【问题描述】:

使用 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

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

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

    即使是 mapReduce 命令has this option,您也可以将“nonAtomic”设置为 mapReduce 的输出集合将表现出相同行为的条件。

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

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

    【讨论】:

    • 谢谢,这回答了我的问题。附带说明:官方文档中是否有任何地方明确声明$out 在每个文档级别上工作?还是假设是这样,因为这是 Mongo 正常运行的方式,除非另有说明。
    • @szymek 你在那儿误引我的话。除了使用 WiredTiger 存储引擎之外,我没有说“文档锁定级别”。 “原子”文档更新和“锁定”在并发方面是两件不同的事情。我所说的是它“产生”,因此在编写文档流时允许其他操作发生。可悲的是,没有文档。只需运行测试。
    • 确定你是对的,在那里采取了一些心理捷径并把所有事情搞混了。感谢yield的解释
    • 您提到“$out 将删除所有文档......当使用'替换'模式时”。除了替换模式之外,还有其他方法可以使用 $out 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    相关资源
    最近更新 更多