Mongodb Mongo多对多

Mongodb Mongo多对多,mongodb,optimization,schema,database,Mongodb,Optimization,Schema,Database,我试图建立一种多对多的关系模型,顾客“喜欢”一种食物 我希望得到很多(数百万)这样的关系,所以我不希望它们都出现在一个无法扩展的连接表中 我创建了两个文档集 Customers - name etc - countOfLoves - loves [ ... ] 及 在每个文档中都有一个子文档集合“loves”,表示关系和一个计数,以快速获得总数 我曾认为这可以很好地扩展,因为我不需要对一个有数百万行的表进行查询,而只需要得到一个文档和它的子数组。然而,当一个顾客开始喜欢很多食物时,我遇

我试图建立一种多对多的关系模型,顾客“喜欢”一种食物

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

我创建了两个文档集

Customers
 - 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表,这样就可以了?

我认为如果文档的大小太大,无法适应它的位置,那么它将被移动到另一个位置,这是原因之一。这可能是由于10秒的原因而开启的。您可以在此处看到类似的讨论:。其中一个解决方案是在创建时使用虚拟值对数组进行归档,并使用一些方法来更新它们,而不是添加新值。在这种情况下,您可能需要选择一个或多个集合作为“爱”,其中您将为每个爱存储客户Id和他所爱的内容

创建第三个集合的替代方法是允许为每个食品和客户创建多个记录。在这种情况下,您可以对每个收藏的“爱”设置一个限制(例如10),填充该数字,然后在所有插槽都满后移动到一个新记录。您可能希望在每个文档中都有一个“完整”标志,该标志将作为查找索引的一部分,以允许快速插入。嗯,这看起来不错,但有什么可能的填充方式呢?有什么想法吗?请参阅下页,该页提供了手动填充的指导:
 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