根据其他集合的查询更新文档

Posted

技术标签:

【中文标题】根据其他集合的查询更新文档【英文标题】:Update a document based on a query depending on other collection 【发布时间】:2015-08-20 21:50:33 【问题描述】:

Mongodb 中是否有可能根据对其他集合中文档“计数”的查询来更新文档? 我正在寻找使其成为原子操作的选项。

更具体地说,以下是这两个集合的设计方式:

书籍(收藏)

_id 姓名 isReviewed [布尔]

评论(收藏)

_id bookID [图书收藏中的_id] 评论

我想出这个设计是因为一本书的“评论”数组会不断增长并且是可变的。 现在,当有“Review”文档时,需要将“Book”文档中的 isReviewed 标志设置为“true”。为各自的书创建。只要一本书至少存在一条相关评论,该标志就会保持“真实”。

当一本书没有评论时,相同的标志将设置为“false”。 (创建图书文档时,该标志的默认值为“false”) 删除评论时,将计算一本书的评论计数以查看是否可以将其设置为“false”。 (如果count为0,则设置为false)。

该系统专为共享书籍和评论等所有资源的多用户环境而设计。所有用户都被授予对所有资源的读/写权限。(我知道允许所有用户能够创建/读取/编辑/删除所有评论听起来很奇怪,但是,假设在功能上就是这样)。

现在,考虑到上述情况,我如何确保根据“评论”集合中的“计数”执行与设置“isReviewed”标志相关的更新?

这是一个没有事务就无法解决的案例(我的意思是,我需要 RDBMS)吗?我也愿意重新设计我的收藏。

感谢您的帮助,谢谢

【问题讨论】:

我认为您唯一可行的选择(操作保持原子性)是将审阅文档嵌套为书籍的子文档。 @bardzusny 感谢您的回复。在我想出这个拥有两个系列的设计之前,我考虑了这个选项。正如我在问题中提到的,我需要两个集合,因为“评论”会不断增长并且是可变的。 【参考方案1】:

由于 mongodb 在文档级别提供 AUTOMICITY,您可以按如下方式预先加入您的书籍和评论集合:

db.Books.insert(

 "_id" : 1,
 "Name": "ABC",
 "reviews": [ ],
 "count" : 0

P.S : 您的文档大小应在 16MB 以内,最大值为 MAX。 如果您期望您的“评论”不止于此,您将不得不分成 两个集合并在您的代码中处理案例。

【讨论】:

感谢您的回复。我知道,事实上,我的情况是“评论”数组将继续增长并且应该能够对数组项执行 CRUD 操作。 (正如我在问题中提到的)。当它是两个集合的情况时,您提到我需要在我的代码中处理。你能给我一个示例代码吗?如果它可以帮助我保持数据的一致性,我完全赞成这样做。感谢您的帮助

以上是关于根据其他集合的查询更新文档的主要内容,如果未能解决你的问题,请参考以下文章

如何在 onUpdate 函数中通过从同一集合中读取来更新同一文档

在 Mongodb 的集合中根据 dob 更新年龄

如何根据现有的 mongoose 查询检查单个文档?

如何根据集合中的文档位置进行分页? (偏移分页)

如何根据MongoDB中文档字段中的每个数组项过滤集合

运行MongoDB查询以更新循环中的序列字段