Mongo DB聚合嵌入式文档

时间:2017-03-10 11:28:17

标签: mongodb aggregation-framework

我有这样的产品系列,简化:

[
  {
    "_id": 1,
    "ref": "product 1",
    "variants": [
      {
        "ref": "variant 1.1",
        "categories": ["category a"]
      },
      {
        "ref": "variant 1.1",
        "categories": ["category a","category b"]
      }
    ]
  },
  {
    "_id": 2,
    "ref": "product 2",
    "variants": [
      {
        "ref": "variant 2.1",
        "categories": ["category c"]
      },
      {
        "ref": "variant 2.1",
        "categories": ["category a","category c"]
      }
    ]
  }
]

我想查询类别(不同)及其包含的产品数量(不是变体)。

例如某些结果如下:

[
  "category a": 2,
  "category b": 1,
  "category c": 1
]

我尝试了一些聚合和放松的查询,但我无法弄清楚。所有帮助表示赞赏!

这是我到目前为止所做的:

[
  {$match: ... }, // optional filtering
  {$unwind: '$variants'},
  {$unwind: '$variants.categories'},
]

但现在无法弄清楚,如何按类别分组,并且该类别中所有产品(非变体)的总计数。

1 个答案:

答案 0 :(得分:1)

db.products.aggregate([
    {$unwind: "$variants"},
    {$unwind: "$variants.categories"},
    {$group: {_id:"$_id", categories: {$addToSet:"$variants.categories"}}},
    {$unwind: "$categories"},
    {$group: {_id: "$categories", count: {$sum:1}}}
])

输出:

{ "_id" : "category b",  "count" : 1 }
{ "_id" : "category c",  "count" : 1 }
{ "_id" : "category a",  "count" : 2 }

<强>解释即可。前两个展开运算符将从嵌套数组中带出类别,你将拥有这样的文档

{
    "_id" : 1,
    "ref" : "product 1",
    "variants" : {
        "ref" : "variant 1.1",
        "categories" : "category a"
    }
},
{
    "_id" : 1,
    "ref" : "product 1",
    "variants" : {
        "ref" : "variant 1.1",
        "categories" : "category a"
    }
},
{
    "_id" : 1,
    "ref" : "product 1",
    "variants" : {
        "ref" : "variant 1.1",
        "categories" : "category b"
    }
},
...

接下来,我进行分组以消除每个产品变体的重复类别。结果:

{
    "_id" : 1,
    "categories" : [ 
        "category b", 
        "category a"
    ]
},
...

再一次摆脱类别数组。

{
    "_id" : 1,
    "categories" : "category b"
},
{
    "_id" : 1,
    "categories" : "category a"
},
{
    "_id" : 2,
    "categories" : "category a"
},
{
    "_id" : 2,
    "categories" : "category c"
}

然后分组以计算每种产品中不同类别的数量。您将拥有上面指定的输出。