Mongodb 当一个字段位于子文档数组中时,如何从集合中获取两个字段的不同组合

Mongodb 当一个字段位于子文档数组中时,如何从集合中获取两个字段的不同组合,mongodb,mongodb-query,tuples,aggregation-framework,distinct-values,Mongodb,Mongodb Query,Tuples,Aggregation Framework,Distinct Values,来自由代表类似以下产品的文档组成的集合: [ { code: "0WE3A5CMY", name: "lorem", category: "voluptas", variants: [ { color: "PapayaWhip", stock: 17, barcode: 4937310396997 }, { color: "RoyalBlue",

来自由代表类似以下产品的文档组成的集合:

[
  {
    code: "0WE3A5CMY",
    name: "lorem",
    category: "voluptas",
    variants: [
      {
        color: "PapayaWhip",
        stock: 17,
        barcode: 4937310396997
      },
      {
        color: "RoyalBlue",
        stock: 13,
        barcode: 9787252504890
      },
      {
        color: "DodgerBlue",
        stock: 110,
        barcode: 97194456959791
      }
    ]
  },
  {
    code: "0WE3A5CMX",
    name: "ipsum",
    category: "temporibus",
    variants: [
      {
        color: "RoyalBlue",
        stock: 113,
        barcode: 23425202111840
      },
      {
        color: "DodgerBlue",
        stock: 10,
        barcode: 2342520211841
      }
    ]
  },
  {
    code: "0WE3A5CMZ",
    name: "dolor",
    category: "temporibus",
    variants: [
      {
        color: "MaroonRed",
        stock: 17,
        barcode: 3376911253701
      },
      {
        color: "RoyalBlue",
        stock: 12,
        barcode: 3376911253702
      },
      {
        color: "DodgerBlue",
        stock: 4,
        barcode: 3376911253703
      }
    ]
  }
]
我想检索
变体.color
类别的不同组合。因此,结果应该是:

[
    {
        category: 'voluptas',
        color: 'PapayaWhip',
    },
    {
        category: 'voluptas',
        color: 'RoyalBlue',
    },
    {
        category: 'voluptas',
        color: 'DodgerBlue',
    },
    {
        category: 'temporibus',
        color: 'RoyalBlue',
    },
    {
        category: 'temporibus',
        color: 'DodgerBlue',
    }
]
基于一些粗略的研究,我想我将不得不使用一个聚合,但我从未使用过这些,可能需要一些帮助。我已经试过了 我尝试过jcarter在评论中提到的方法,但它没有解决我的问题。如果我这样做:

db.products.aggregate([
{
$group:{
_身份证:{
“类别”:“$category”,
“颜色”:“$variants.color”
}
}
}
])
我得到的结果是:

[
  {
    "_id": {
      "category": "temporibus",
      "color": [
        "MaroonRed",
        "RoyalBlue",
        "DodgerBlue"
      ]
    }
  },
  {
    "_id": {
      "category": "temporibus",
      "color": [
        "RoyalBlue",
        "DodgerBlue"
      ]
    }
  },
  {
    "_id": {
      "category": "voluptas",
      "color": [
        "PapayaWhip",
        "RoyalBlue",
        "DodgerBlue"
      ]
    }
  }
]

这不是我所需要的。

因为
variants
是一个数组,您需要将其展开并在两个字段上分组,以获得基于
类别+“variants.color”组合的唯一文档

小组阶段的结果如下:

[
  {
    "_id": {
      "category": "voluptas",
      "color": "DodgerBlue"
    }
  },
  {
    "_id": {
      "category": "voluptas",
      "color": "PapayaWhip"
    }
  }
]
然后使用
$replaceRoot
阶段,您可以将
\u id
对象字段作为每个文档的根,以获得所需的结果

查询:

db.collection.aggregate([
    {
      $unwind: "$variants"
    },
    {
      $group: { _id: { "category": "$category", "color": "$variants.color" } }
    },
    {
      $replaceRoot: { newRoot: "$_id" }
    }
  ])

测试:

嗨,卡恩!我相信这是这个问题的重复:对于一个类别,所有文档的
类别
是否都是唯一的
颜色
在所有
变体中都是唯一的?@whoami为了简洁起见,我没有提供完整的数据集。因此,肯定会有多个文档具有相同的类别。@jcarter我已经尝试过该解决方案,但它提供了wierd结果。我将更新问题carter/kaan:Yes
$group
阶段用于对单个文档进行分组,并返回基于标准组合在一起的文档组(此处基于两个字段
类别+变体
)。但实际问题是
color
在数组
variants
中,所以在分组阶段,当您执行
时,“color”:“$variants.color”
它将从文档的
variants
数组的所有元素中获取所有
'variants.color'
颜色。因此,我们首先需要
$unwind
变量来获取
颜色的字符串,而不是数组。。