2013-04-04 90 views
3

我试图模拟客户喜欢食物的多对多关系。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) - 我是在优化 - 我应该只是做一个爱连接表,这将是罚款)​​

回答

1

一个我看到它,如果是缓慢的原因文件的大小很大,不适合它的位置,它将被移到另一个地方。这可能是10秒的原因。你可以在这里看到类似的讨论:https://groups.google.com/forum/?fromgroups=#!topic/mongodb-user/FnL0mDWs5w0。解决方案之一是在创建时使用虚拟值提交数组,并使用一些如何更新它们而不添加新的爱。在这种情况下,可能是你必须选择一个更集合作为爱,其中对于每个爱你的存储客户ID和他所爱

+0

创造一个第三收集另一种方法是,让每个食品和客户的多个记录。在这种情况下,您可以对每个集合(例如10个)的爱数进行限制,然后填充该数字,然后在所有插槽已满时移动到新记录。您需要在每个文档中包含“完整”标志,这些标志将作为查找索引的一部分,以便快速插入。 – 2013-04-04 13:13:25

+0

嗯这看起来不错的选择,但什么是可能的方式填充它很好的方式任何想法? – Devesh 2013-04-04 14:28:43

+1

参见下页,其中手动填充提供指导:http://docs.mongodb.org/manual/faq/developers/#can-i-manually-pad-documents-to-prevent-moves-during-updates – 2013-04-04 14:33:11