根据其他集合的查询更新文档
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 操作。 (正如我在问题中提到的)。当它是两个集合的情况时,您提到我需要在我的代码中处理。你能给我一个示例代码吗?如果它可以帮助我保持数据的一致性,我完全赞成这样做。感谢您的帮助以上是关于根据其他集合的查询更新文档的主要内容,如果未能解决你的问题,请参考以下文章