Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 带有嵌入式文档的Mongo DB聚合_Mongodb_Aggregation Framework - Fatal编程技术网

Mongodb 带有嵌入式文档的Mongo DB聚合

Mongodb 带有嵌入式文档的Mongo DB聚合,mongodb,aggregation-framework,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": 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'},
]
但现在还不知道如何按类别进行分组,因为所有产品的总数都不在该类别内

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"
}
然后分组计算每个产品中不同类别的数量。您将获得上面指定的输出