我试图模拟客户喜欢食物的多对多关系。Mongo多对多
我期待得到这些关系的地段(百万),所以我不想让他们都在同一个最终加入表无法扩展。
我创建了两个文档集合,
Customers
- name etc
- countOfLoves
- loves [ ... ]
和
Foods
- name etc
- countOfLoves
- loves [ ... ]
每个文档里面是“爱”代表的关系和计数,迅速得到总计子文档集合。
我曾以为,这将扩展,因为不是一个查询表上拥有数百万行的我可以得到一个单一的文件以及和它的子阵。但是,当顾客开始喜欢大量食物时(而相反,当食物被很多顾客喜爱时),我遇到了一个问题
以下是更新客户文档时查询新食品被爱。在这种情况下,客户已经喜欢其他食品7000:
query: { _id: "354286" }
update: { $push: { loves: { foodID: "354286", location: [ 55.752197, 37.6156 ] } }, $inc: { countOfLoves: 1 } }
nscanned:1 nupdated:1 keyUpdates:0 locks(micros) w:10135199 10137ms
这里有两个问题真的,
一)这是为什么用10秒钟 - 有一些关于$推,我不知道
二)是否有蒙戈一个更好的架构,可这种关系的模型?
(和我猜(C) - 我是在优化 - 我应该只是做一个爱连接表,这将是罚款)
创造一个第三收集另一种方法是,让每个食品和客户的多个记录。在这种情况下,您可以对每个集合(例如10个)的爱数进行限制,然后填充该数字,然后在所有插槽已满时移动到新记录。您需要在每个文档中包含“完整”标志,这些标志将作为查找索引的一部分,以便快速插入。 – 2013-04-04 13:13:25
嗯这看起来不错的选择,但什么是可能的方式填充它很好的方式任何想法? – Devesh 2013-04-04 14:28:43
参见下页,其中手动填充提供指导:http://docs.mongodb.org/manual/faq/developers/#can-i-manually-pad-documents-to-prevent-moves-during-updates – 2013-04-04 14:33:11