mongodb 增删改 多维数组的问题
发布于 10 年前 作者 jackhutu 7013 次浏览 最后一次编辑是 8 年前

<pre> 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的三级子分类.’ } ] } ] } ] </pre> 如上,这是mongodb 一个集合文档,存储的商品三级分类. 为了发挥mongodb的优势和查询方便,采用这种嵌入式。但是有些蛋疼的问题。 1:对里层数组做增删改的时候无法精确定位。如果再增加四级,五级。那更蛋疼。 2:如果结合商品表查询也不是很爽,每个商品有一个字段是商品分类名。比如:查询sport分类下的所有商品,那就要将sport分类下的数组一层一层循环得到所有分类。这样好像不是很爽。 那最后一个疑问:像这种商品分类和商品表,用mongodb数据库应该怎么样设计才是最后理的????有类似的例子看吗?求指教!

3 回复
  1. 你这模型建立的,太臃肿了,重复太多,提取自然就麻烦。
  2. 内容应该尽可能扁平,四级五级太搞笑了,不要关联太多。

####假设商品分类三级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

@tulayang 2级和3级是相对应的关系,2级有很多,每个2级有很多3级。怎么将它们对应起来呢。

@winky

假设分为如下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的值

回到顶部