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
变量来获取颜色的字符串,而不是数组。。