gpt4 book ai didi

mongoDB 多对多一个查询?

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

在 mysql 中我使用 JOIN 并且一个查询没有问题。 mongo 呢?

想象类别和产品。

产品可能有更多类别。类别可能有更多产品。(多对多结构)管理员可以在管理中编辑类别(类别必须分开)

是否可以在一个查询中写入带有类别名称的产品?

我用过这个结构

categories {
name:"categoryName",
product_id:["4b5783300334000000000aa9","5783300334000000000aa943","6c6793300334001000000006"]
}


products {
name:"productName",
category_id:["4b5783300334000000000bb9","5783300334000000000bb943","6c6793300334001000000116"]
}

现在我可以简单地获取所有产品类别,以及某些类别中的产品和单独的类别进行编辑。但是如果我想用类别名称编写产品,我需要两个查询 - 一个用于获取产品类别 ID,第二个用于通过该 ID 从类别中获取类别名称。

这是正确的方法吗?或者这个结构不合适?我只想查询一个,但不知道是否可行。

最佳答案

是的,MongoDB 尤其不擅长这种特定类型的操作。但是,这也是一个范围问题。如果你有 3000 万个产品,你想将这 300 万个产品加入到它们的类别中,你会发现在许多数据库中并不是很快(即使它是一行代码)。

MongoDB 在这里需要的是一些反规范化。

您的收藏可能看起来像这样:

categories {
_id:"mongoid",
name:"categoryName",
...
}

products {
_id:"mongoid",
name:"productName",
categories:[
{"4b5783300334000000000bb9":'categoryName'},
{"5783300334000000000bb943":'CategoryName2'},
{"6c6793300334001000000116":'categoryName3'}
]
}

这是它的工作原理(粗略估计,手边没有我的 Mongo 实例):

抓取产品及其类别

db.products.find({"_id": {$in:[1,2,3]}, {name:1,categories:1})

抓取特定类别的产品:

db.products.find({"categories.0": {$in:[x,y,z]}},{categories:1,name:1} }

是的,这并不完全相同。当您更改类别名称时,您将不得不更新所有 产品记录。我知道这看起来很奇怪,但这是反规范化的标准。

顺便说一句,我在这里假设您将拥有大量产品和明显更少的类别。如果您在每个类别中有 100 个项目,则此方法可能是最好的。如果每个类别中有 5 个项目,那么您可能希望在每个项目中存储更多的类别信息。

关于mongoDB 多对多一个查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2908743/

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