我正在尝试为客户“喜欢”食物的多对多关系建模。
我希望获得很多(数百万)这样的关系,所以我不希望它们最终都出现在一个无法扩展的连接表中。
我创建了两个文档集合,
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) - 我是不是优化过度了 - 我应该只做一个 loves 连接表就可以了吗?)
最佳答案
我看到它变慢的原因之一是,如果文档的大小太大而不适合它的位置,它将被移动到另一个地方。这可能是上10秒的原因。你可以在这里看到类似的讨论:https://groups.google.com/forum/?fromgroups=#!topic/mongodb-user/FnL0mDWs5w0 .解决方案之一是在创建数组时使用虚拟值归档,并且您使用一些方法来更新它们而不是添加新的 loves 。在这种情况下,您可能必须选择另一个集合作为 Loves,您将在其中为每个爱存储客户 ID 和他所爱的东西
关于mongodb - Mongo 多对多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15807943/