2015-06-05 57 views
0

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

具体而言,以下是如何在两个集合的设计:

书籍(集合)

_id 名称 isReviewed [布尔]

评论(集合)

_id bookID [_id in Books Collection] 评论

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

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

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

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

这是一个没有交易就无法解决的情况(我的意思是,我需要RDBMS)吗?我愿意重新设计我的收藏。

任何帮助表示赞赏,感谢您

+0

我认为你唯一可行的选择(操作保持原子性)是将评审文档作为书籍的子文档嵌套。 – bardzusny

+0

@bardzusny谢谢你的回应。在我提出有两个集合的设计之前,我考虑了这个选择。正如我在问题中提到的那样,我需要两个集合,因为“评论”将会持续增长并且是可变的。 – Vsoma

回答

0

因为MongoDB中的文档级别提供了原子性,您可以预先加入您的书籍和评论集如下:

db.Books.insert(
{ 
"_id" : 1, 
"Name": "ABC", 
"reviews": [ ], 
"count" : 0 

}

PS: MAX的文档大小应该在16MB以内。 如果您期待您的“评论”将不止于此,您将不得不拆分为 两个集合,并在您的代码中处理该案例。

+0

谢谢你的回应。我明白,事实上,我的情况是“评论”数组将继续增长,并应该能够对数组项目执行CRUD操作。 (正如我在我的问题中提到的)。当它是两个集合的情况下,你提到我需要在我的代码中处理。你能给我一个这样的例子代码吗?如果它能帮助我保持数据的一致性,那么我都会这么做。我感谢您的帮助 – Vsoma