在mysql中我使用JOIN并且一个查询没问题.mongo怎么样?
想象类别和产品.
产品可能有更多类别.类别可能有更多的产品.(多对多结构)和管理员可以在管理中编辑类别(类别必须分开)
它可能在一个查询中编写带有类别名称的产品?
我用这个结构
categories { name:"categoryName", product_id:["4b5783300334000000000aa9","5783300334000000000aa943","6c6793300334001000000006"] } products { name:"productName", category_id:["4b5783300334000000000bb9","5783300334000000000bb943","6c6793300334001000000116"] }
现在我可以简单地获取所有产品类别,以及某些类别和类别中的产品进行编辑.但如果我想要用类别名称编写产品,我需要两个查询 - 一个用于获取产品类别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个项目,那么您可能希望在每个项目中存储更多类别信息.