我正在尝试模拟客户“喜欢”食物的多对多关系。
我期望获得很多(数百万)这些关系,所以我不希望它们最终都出现在一个无法扩展的连接表中。
我创建了两个文档集合,
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 表就可以了吗?)