我正试图塑造一个多对多的关系,顾客'喜欢'食物。
我期待得到很多(数百万)这些关系,所以我不希望它们最终都出现在一个无法扩展的连接表中。
我创建了两个文档集,
Customers
- name etc
- countOfLoves
- loves [ ... ]
和
Foods
- name etc
- countOfLoves
- loves [ ... ]
每个文档中都有一个'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
这里有两个问题,
a)为什么这需要10秒钟 - 是否有关于$ push的内容我不知道
b)Mongo是否有更好的架构可以模拟这种关系?
(而且,我想(c) - 我是否过度优化 - 我应该只是做一个爱情联盟表,它会没问题吗?)
答案 0 :(得分:1)
如果文档的大小不适合它的位置,我会看到它变慢的原因之一就是它会移动到另一个地方。这可能是10秒钟的原因。你可以在这里看到类似的讨论:https://groups.google.com/forum/?fromgroups=#!topic/mongodb-user/FnL0mDWs5w0。在创建时使用虚拟值设置数组的解决方案之一,并使用一些如何更新它们而不添加新的爱。在这种情况下,您可能需要选择另外一个收藏作为爱情,每个爱你将存储客户ID和他喜欢的东西