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可能会删除已连接(“查找”)的文档之一,从而导致整个结果不正确/不一致。这会发生吗?如何预防呢?
问:聚合管道处理的MongoDB文档在管道执行过程中会受到外部写入的影响吗?
\n答:取决于事务如何相互隔离。
\n快照隔离是指事务看到一致的数据视图:事务可以从事务启动时提交的 \xe2\x80\x9csnapshot\xe2\x80\x9d 数据中读取数据。任何冲突的更新都会导致事务中止。
\nMongoDB 事务支持事务级读关注和事务级写关注。客户端可以设置适当的读和写关注级别,最严格的是快照读关注与多数写关注相结合。。
\n要实现此目的,请在连接字符串/会话/事务上设置readConcern=snapshot和writeConcern=majority (但不要在数据库/集合/操作上设置,因为在事务下数据库/集合/操作关注点设置将被忽略)。
\n问:事务是否也适用于所有聚合管道阶段?
\nA:事务中并非允许所有操作。
\n例如,根据 mongodb文档, db.collection.aggregate()事务中允许,但某些阶段(例如$merge)被排除。\n事务内支持的操作的完整列表:请参阅 mongodb文档。
| 归档时间: |
|
| 查看次数: |
862 次 |
| 最近记录: |