gpt4 book ai didi

mongodb - Mongo 多对多

转载 作者:可可西里 更新时间:2023-11-01 09:52:50 26 4
gpt4 key购买 nike

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

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

我创建了两个文档集合,

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com