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

问题描述 投票:1回答:1

来自包含代表与以下产品相似的产品的文档的集合:

[
  {
    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
      }
    ]
  }
]

我想检索variants.colorcategory的不同组合。所以结果应该是:

[
    {
        category: 'voluptas',
        color: 'PapayaWhip',
    },
    {
        category: 'voluptas',
        color: 'RoyalBlue',
    },
    {
        category: 'voluptas',
        color: 'DodgerBlue',
    },
    {
        category: 'temporibus',
        color: 'RoyalBlue',
    },
    {
        category: 'temporibus',
        color: 'DodgerBlue',
    }
]

[基于一些粗略的研究,我认为我将不得不使用汇总,但是我从未使用过这些汇总,可以使用一些帮助。我已经尝试过How to efficiently perform "distinct" with multiple keys?的解决方案我已经尝试了jcarter在评论中提到的方法,但是并不能解决我的问题。如果我这样做:

db.products.aggregate([
  {
    $group: {
      _id: {
        "category": "$category",
        "color": "$variants.color"
      }
    }
  }
])

我得到结果:

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

不是我所需要的。

mongodb mongodb-query tuples aggregation-framework distinct-values
1个回答
1
投票

由于variants是一个数组,您需要对其展开并在两个字段上分组以基于category + 'variants.color'组合获得唯一的文档。

© www.soinside.com 2019 - 2024. All rights reserved.