3

我正在尝试模拟客户“喜欢”食物的多对多关系。

我期望获得很多(数百万)这些关系,所以我不希望它们最终都出现在一个无法扩展的连接表中。

我创建了两个文档集合,

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) - 我是否过度优化 - 我应该只制作一个love join 表就可以了吗?)

4

1 回答 1

1

如果文档的大小不适合其位置,我认为它会变慢的原因之一是它将被移动到另一个地方。这可能是 10 秒的原因。您可以在这里看到类似的讨论:https ://groups.google.com/forum/?fromgroups=#!topic/mongodb-user/FnL0mDWs5w0 。在创建时将数组归档为虚拟值的解决方案之一,您可以使用一些方法来更新它们而不是添加新的爱。在这种情况下,您可能必须再选择一个收藏品作为“爱”,对于每一个爱,您都将存储客户 ID 和他喜欢的东西

于 2013-04-04T12:15:42.467 回答