mongodb - Mongo 多对多

标签 mongodb optimization schema database

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

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

我创建了两个文档集合,

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/

相关文章:

C中使用链表的CPU缓存缺点

c++ - 按顺序组织输出数据

.net - .Net 中的 XSD 正则表达式模式导致应用程序挂起

mongodb - 适用于grails 2.2.x的mongodb gorm插件的最佳版本?

android - 将meteor apk连接到heroku/mLab db

c# - MongoDB C# 聚合 - unwind -> groupBy

xml - 如果架构需要一个属性并且我将其作为元素发送,它是否无效?

node.js - 可选 $match 管道运算符的 Mongodb 聚合追加方法

python - 如何找出为什么 cython 化代码会减慢速度?

xml - 验证时的 DTD 信息和相关错误(XSD 模式)——它们可以被忽略吗?