聚合管道处理的MongoDB文档在管道执行过程中会受到外部写入的影响吗?

Ras*_*sto 5 database mongodb nosql nosql-aggregation aggregation-framework

MongoDB 聚合管道的各个阶段始终按顺序执行。管道处理的文档可以在阶段之间更改吗?例如,如果stage1与collection1中的某些文档匹配,而stage2与collection2中的某些文档匹配,是否可以在stage1期间或之后(即stage2之前)写入collection2中的某些文档?如果是这样,可以防止这种行为吗?

为什么这很重要:假设stage2是一个$lookup阶段。Lookup 是相当于 SQL join 的 NoSQL。在典型的 SQL 数据库中,连接查询与写入是隔离的。这意味着在解析连接时,受连接影响的数据不能更改。我想知道 MongoDB 是否有同样的保证。请注意,我来自 noSQL 世界(只是不是 MongoDB),并且我很好地理解这个范例。不需要建议例如复制数据,如果有这样的解决方案,我就不会这么问。


根据我的研究,MongoDb 读取查询获取共享(读取)锁,该锁可防止在同一集合上写入,直到解决为止。然而,MongoDB 文档没有提及任何有关聚合管道锁的内容。聚合管道是否对其读取的所有集合持有读(共享)锁?或者只是当前管道阶段使用的集合?

更多上下文:我需要通过多个集合运行具有多个“连接”的“查询”。查询是动态生成的,我不预先知道将“连接”哪些集合。聚合管道是实现这一点的假定方法。但是,为了获得一致的“查询”数据,我需要确保管道各阶段之间不会交错写入。

$match例如,阶段之间的删除$lookup可能会删除已连接(“查找”)的文档之一,从而导致整个结果不正确/不一致。这会发生吗?如何预防呢?

ega*_*mov 2

问:聚合管道处理的MongoDB文档在管道执行过程中会受到外部写入的影响吗?

\n

答:取决于事务如何相互隔离。

\n

快照隔离是指事务看到一致的数据视图:事务可以从事务启动时提交的 \xe2\x80\x9csnapshot\xe2\x80\x9d 数据中读取数据。任何冲突的更新都会导致事务中止。

\n

MongoDB 事务支持事务级读关注事务级写关注客户端可以设置适当的读和写关注级别,最严格的是快照读关注多数写关注相结合。

\n

要实现此目的,请在连接字符串/会话/事务上设置readConcern=snapshotwriteConcern=majority (但不要在数据库/集合/操作上设置,因为在事务下数据库/集合/操作关注点设置将被忽略)。

\n

问:事务是否也适用于所有聚合管道阶段?

\n

A:事务中并非允许所有操作。

\n

例如,根据 mongodb文档, db.collection.aggregate()事务中允许,但某些阶段(例如$merge)被排除。\n事务内支持的操作的完整列表:请参阅 mongodb文档

\n