var catList = [ { cat_name : 'sport', cat_desc : '第一个顶级分类.', sub_cat: [ { cat_name : 'sport_bag', cat_desc : 'sport的二级子分类.', },{ cat_name : 'sport_apparel', cat_desc : 'sport的二级子分类.', sub_cat: [ { cat_name : 'sport_apparel_men', cat_desc : 'sport的三级子分类.' },{ cat_name : 'sport_apparel_women', cat_desc : 'sport的三级子分类.' } ] } ] },{ cat_name : 'stationery', cat_desc : '第二个顶级分类.', sub_cat: [ { cat_name : 'stationery_bag', cat_desc : 'stationery的二级子分类.', },{ cat_name : 'stationery_apparel', cat_desc : 'stationery的二级子分类.', sub_cat: [ { cat_name : 'stationery_apparel_men', cat_desc : 'sport的三级子分类.' } ] } ] } ]如上,这是mongodb 一个集合文档,存储的商品三级分类. 为了发挥mongodb的优势和查询方便,采用这种嵌入式。但是有些蛋疼的问题。 1:对里层数组做增删改的时候无法精确定位。如果再增加四级,五级。那更蛋疼。 2:如果结合商品表查询也不是很爽,每个商品有一个字段是商品分类名。比如:查询sport分类下的所有商品,那就要将sport分类下的数组一层一层循环得到所有分类。这样好像不是很爽。 那最后一个疑问:像这种商品分类和商品表,用mongodb数据库应该怎么样设计才是最后理的????有类似的例子看吗?求指教!
3 回复
- 你这模型建立的,太臃肿了,重复太多,提取自然就麻烦。
- 内容应该尽可能扁平,四级五级太搞笑了,不要关联太多。
####假设商品分类三级A->B->C,应该建立1个集合
[{
_id: xxx,
cat_name : 'xxx',
cat_desc : 'xxx',
A: 1
},
{
_id: xxx,
cat_name : 'xxx',
cat_desc : 'xxx',
A: 1,
B: 1
},
{
_id: xxx,
cat_name : 'xxx',
cat_desc : 'xxx',
A: 1,
B: 1,
C: 1
},
...]
需要1级,只需要检索拥有A:1 需要2级,只需要检索拥有B:1 需要3级,只需要检索拥有C:1
####或者建立2个集合
cat集合
[{
_id: xxx,
cat_name : 'xxx',
cat_desc : 'xxx',
},
...]
level集合
[{
_id: xxx,
level: 1, // 第1级
cat_id: [xxx, xxx, xxx, ...]
},
{
_id: xxx,
level: 2, // 第2级
cat_id: [xxx, xxx, xxx, ...]
},
{
_id: xxx,
level: 3, // 第3级
cat_id: [xxx, xxx, xxx, ...]
}]
需要哪个等级只需要检索level对应集合和cat集合, 添加新值要同步level和cat
假设分为如下4级:
食品 - 面食 - 面包 - 红色
食品 - 面食 - 包子 - 圆的
食品 - 水果 - 苹果 - 小的
汽车 - 跑车 - AAA - 贵的
汽车 - 电车 - BBB - 便宜的
厨具 - 勺子 - MMM - 圆的
可以将其对应为:
A - B - C - D
建立集合如下:
{
_id: xxx,
cat_name : 'xxx',
cat_desc : 'xxx',
A : '食品'
B : '面食',
C : '面包',
D : '红色'
},
{
_id: xxx,
cat_name : 'xxx',
cat_desc : 'xxx',
A : '汽车'
B : '跑车',
C : 'AAA',
D : '贵的'
},
...
查找食品下面的直接分类: 查找A=食品, 在结果中获取其中B的值
查找面包的分类: 查找C=面包, 在结果中获取其中D的值