我有两个对象:
没有篮子的香蕉可以存在
但是一个篮子必须包含香蕉。
我做了:
香蕉班 embedded_in班级篮子 嵌入香蕉
BUT
当我尝试制作一个香蕉时,mongoid抱怨没有一个篮子。
解决方案是什么?
答案 0 :(得分:0)
没有篮子的香蕉可以存在
这使得它成为一级公民,所以嵌入不是一个真正的选择(人们可以为不在篮子里的香蕉制作'影子篮',但这个想法在凌晨1点过于令人毛骨悚然。不推荐)。
听起来篮子里可能有不止一个香蕉,但即使没有,转动聚集似乎也没有意义(即把篮子放在'香蕉'中)。它不会模拟现实,所以它可能是一个糟糕的设计。
篮子必须包含香蕉。
您必须在客户代码中确保这一点,并将香蕉和篮子作为一级公民:
basket { _id : 7871, ... }
banana { _id : 4545, basket_id : 7871, ... }
或
basket { _id : 7871, banana_ids : [ 4545, ... ] }
banana { _id : 4545, ... }
第二种变体可以更容易地执行篮子必须有香蕉的规则,而第一种变体可以更容易确保一个香蕉同时不在两个篮子中。
确保满足这些条件并非易事,因为mongodb不支持事务,并且您不能自动修改多个文档。您的客户端代码必须处理此问题,例如通过锁定。