【问题标题】:Mongo DB aggregate with embedded documents带有嵌入文档的 Mongodb 聚合
【发布时间】:2017-07-31 17:37:13
【问题描述】:

我有一个这样的产品集合,简化:

[
  {
    "_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'},
]

但现在无法弄清楚如何按类别分组,以及该类别内所有产品(不是变体)的总计数。

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案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"
    }
    

    然后分组计算每个产品中不同类别的计数。您将获得如上指定的输出。

    【讨论】:

      猜你喜欢
      • 2019-10-20
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-16
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      相关资源
      最近更新 更多