Mongodb 具有聚合框架的嵌套组
在我的收藏中,我有大量的文档,每个文档包含4种类型的类别Mongodb 具有聚合框架的嵌套组,mongodb,mongoose,aggregation-framework,Mongodb,Mongoose,Aggregation Framework,在我的收藏中,我有大量的文档,每个文档包含4种类型的类别 组 main类别 子类别 子类别 我正在寻找一种方法来$group通过group和group内部应该有一个maincegory数组,在maincegory中应该有一个subCategory数组,在subCategory中应该有一个subcategegegory数组。结果应仅包含类别的值/名称 预期结果: const result = [ { "group": &q
组
main类别
子类别
子类别
$group
通过group
和group
内部应该有一个maincegory
数组,在maincegory
中应该有一个subCategory
数组,在subCategory
中应该有一个subcategegegory
数组。结果应仅包含类别的值/名称
预期结果:
const result = [
{
"group": "Teknik",
"mainCategory": [
{
"name": "Gaming",
"subCategory": [
{
"name": "Playstation",
"subSubCategory": [
{"name": "Games"},
{"name": "Accessories"},
{"name": "Console"}
]
},
{
"name": "Xbox",
"subSubCategory": [
{"name": "Games"},
{"name": "Accessories"},
{"name": "Console"}
]
}
]
}, {
"name": "Audio",
"subCategory": [
{
"name": "Headphones",
"subSubCategory": [
{"name": "Wireless"},
{"name": "Non Wireless"},
]
},
{
"name": "Speakers",
"subSubCategory": [
{"name": ""},
]
}
]
},
]
}
]
我认为问题在于我需要$push
父类别中的每个类别,并创建新的$groups
?但是当添加更多的$group
时,只有最后一个被“保存”。其他人似乎没有被“拯救”。还是我做错了什么
基于prev的示例数据和工作代码。测试数据
收藏中的产品结构
productName :"Horizon Zero Dawn"
group:"Teknik"
mainCategory: "Gaming"
subCategory:"Playstation"
subSubCategory: "Games"
我的集合
const categories = await Product.aggregate([
{$match: {group: 'Teknik'}},
{
$group: {
_id: {
group: '$group',
mainCategory: '$mainCategory',
subCategory: '$subCategory',
subSubCategory: '$subSubCategory',
}
},
},
{
$group: {
_id: "$_id.group",
mainCategory: {
$push:
{
name: "$_id.mainCategory",
subCategory: {
name: "$_id.subCategory",
subSubCategory: {
name: "$_id.subSubCategory"
}
}
}
},
}
},
]);
这样,我为每个子类别得到一个对象,但我希望它们在同一个对象中
"_id": "Teknik",
"mainCategory": [
{
"name": "Gaming",
"subCategory": {
"name": "Xbox",
"subSubCategory": {
"name": "Games"
}
}
},
{
"name": "Spel & Gaming",
"subCategory": {
"name": "Xbox",
"subSubCategory": {
"name": "Accessories"
}
}
},
]
该过程是从阵列的末级开始准备:
- 您的
条件$match
by只有3个主字段,不添加$group
子类别
- 该组准备
数组子类别
- 在上面的
中,将有可能重复$group
,因此这将删除重复项,如果您不想删除,则可以跳过此部分子类别
- 现在,
仅由2个主字段$group
- 这将准备
数组,推送我们在上述组中准备的子类别
和名称
数组子类别
按主$group
组
字段
- 这将准备
数组,推送我们在上述组中准备的main类别
和name
数组子类别
删除$project
并显示\u id
和组
字段主类别
游乐场:@turivishal它在帖子的顶部,const result=[…]但是现在已经澄清了。大约有40000个文档,所以我在上面的链接中添加了一些示例数据。非常感谢!使用我提供的数据按预期工作。但是,我注意到我没有插入共享组但不共享主类别的测试数据。很抱歉。我用更准确的测试数据和代码更新了mongoplayground。如果您能给我一些关于如何解决这个问题的建议,我将不胜感激。我可以在许多文档中看到subSubCategory是空字符串,您对此的期望是什么?我可以看到这一点,让我知道我是否丢失了。空字符串就在那里,因为有一个空值比每次检查元素是否存在更简单。有些产品有子产品,有些没有。对不起,我不明白你的最后一句话?我只希望组名“teknik”一次,然后mainCategory应该是一个数组,其中包含所有主要类别(Mobil、Spel&Gaming、Ljud&Bild)。当subSub为空时,我不想删除主对象,如上所述。我已经更新了答案,您可以检查,问题在最后一组中,只需按
组
字段分组,让我知道是否有任何问题,
db.collection.aggregate([
{ $match: { group: "Teknik" } },
{
$group: {
_id: {
group: "$group",
mainCategory: "$mainCategory",
subCategory: "$subCategory"
},
subSubCategory: {
$push: { name: "$subSubCategory" }
}
}
},
{
$addFields: {
subSubCategory: { $setUnion: ["$subSubCategory", [] ] }
}
},
{
$group: {
_id: {
group: "$_id.group",
mainCategory: "$_id.mainCategory"
},
subCategory: {
$push: {
name: "$_id.subCategory",
subSubCategory: "$subSubCategory"
}
}
}
},
{
$group: {
_id: "$_id.group",
mainCategory: {
$push: {
name: "$_id.mainCategory",
subCategory: "$subCategory"
}
}
}
},
{
$project: {
_id: 0,
group: "$_id",
mainCategory: 1
}
}
])