想象类别和产品。
产品可能有更多类别。 类别可能有更多的产品。 (多对多结构) 管理员可以在管理中编辑类别(类别必须分开)
它可能在一个查询中写入带有类别名称的产品吗?
我使用了这个结构
categories {
name:"categoryName",
product_id:["4b5783300334000000000aa9","5783300334000000000aa943","6c6793300334001000000006"]
}
products {
name:"productName",
category_id:["4b5783300334000000000bb9","5783300334000000000bb943","6c6793300334001000000116"]
}
现在,我可以简单地获取所有产品类别,以及某些类别和类别中的产品进行编辑。但如果我想要用类别名称编写产品,我需要两个查询 - 一个用于获取产品类别ID,第二个用于按类别从类别中获取类别名称。
这是正确的方法吗?或者这种结构不合适?我想只有一个查询,但我不知道它是否可能。
答案 0 :(得分:5)
是的,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个项目,那么您可能希望在每个项目中存储更多类别信息。答案 1 :(得分:1)
是的,这是你唯一的方式。没有加入的可能性。
但您可以在类别或产品文档中添加大量信息,例如:
categories {
name:"categoryName",
product_id:[ {"4b5783300334000000000aa9": 'productName'},{"5783300334000000000aa943":'productName2'},{"6c6793300334001000000006":'productName3'}]
}
products {
name:"productName",
category_id:[{"4b5783300334000000000bb9":'categoryName'},{"5783300334000000000bb943":'CategoryName2',{"6c6793300334001000000116":'categoryName3'}]
}
但是你需要在更改时更新所有文档时进行一些回调。