MongoDB 聚合 - $filter in projection for embedded arrays
MongoDB Aggregation - $filter in projection for embedded arrays
我有一个复杂的 JSON 对象结构,其中包含 (N) 个嵌入式数组。单个条目是具有两个字段的对象:@name
和 content
。我需要在投影阶段过滤它们(不使用 $unwind
)以获得一个特定对象,其中 @name
字段等于特定值:
productCategory: {$filter: {
input: '$characteristics.attributeGroup.attribute',
as: 'attribute',
cond: {
...?
}}
$characteristics.attributeGroup.attribute
输入returns以上结构。我试图在 $cond: { $eq: ['$$attribute.@name', 'averageRating'] }
中使用类似的东西,但它不起作用。
你能帮我找出解决办法吗?
提前致谢!
你可以试试,
$reduce
迭代 attributeGroup
数组的循环,并使用 $mergeObjects
返回合并对象
- 如果属性的类型是
object
检查条件然后再次检查第二个条件如果 @name 匹配然后 return 值否则移动到其他条件
$reduce
迭代 attribute
数组的循环,如果名称匹配则检查条件 return 值
let name = "Artikelhinweise";
db.collection.aggregate([
{ $match: { "attributeGroup.attribute.@name": name } }, // name pass here
{
$project: {
attributeGroup: {
$reduce: {
input: "$attributeGroup",
initialValue: {},
in: {
$mergeObjects: [
"$$value",
{
$cond: [
{ $eq: [{ $type: "$$this.attribute" }, "object"] },
{
$cond: [
{ $eq: ["$$this.attribute.@name", name] }, // name pass here
{
"@name": "$$this.attribute.@name",
"content": "$$this.attribute.content"
},
"$$value"
]
},
{
$reduce: {
input: "$$this.attribute",
initialValue: {},
in: {
$cond: [
{ $eq: ["$$this.@name", name] }, // name pass here
{
"@name": "$$this.@name",
"content": "$$this.content"
},
"$$value"
]
}
}
}
]
}
]
}
}
}
}
}
])
我有一个复杂的 JSON 对象结构,其中包含 (N) 个嵌入式数组。单个条目是具有两个字段的对象:@name
和 content
。我需要在投影阶段过滤它们(不使用 $unwind
)以获得一个特定对象,其中 @name
字段等于特定值:
productCategory: {$filter: {
input: '$characteristics.attributeGroup.attribute',
as: 'attribute',
cond: {
...?
}}
$characteristics.attributeGroup.attribute
输入returns以上结构。我试图在 $cond: { $eq: ['$$attribute.@name', 'averageRating'] }
中使用类似的东西,但它不起作用。
你能帮我找出解决办法吗?
提前致谢!
你可以试试,
$reduce
迭代attributeGroup
数组的循环,并使用$mergeObjects
返回合并对象
- 如果属性的类型是
object
检查条件然后再次检查第二个条件如果 @name 匹配然后 return 值否则移动到其他条件 $reduce
迭代attribute
数组的循环,如果名称匹配则检查条件 return 值
let name = "Artikelhinweise";
db.collection.aggregate([
{ $match: { "attributeGroup.attribute.@name": name } }, // name pass here
{
$project: {
attributeGroup: {
$reduce: {
input: "$attributeGroup",
initialValue: {},
in: {
$mergeObjects: [
"$$value",
{
$cond: [
{ $eq: [{ $type: "$$this.attribute" }, "object"] },
{
$cond: [
{ $eq: ["$$this.attribute.@name", name] }, // name pass here
{
"@name": "$$this.attribute.@name",
"content": "$$this.attribute.content"
},
"$$value"
]
},
{
$reduce: {
input: "$$this.attribute",
initialValue: {},
in: {
$cond: [
{ $eq: ["$$this.@name", name] }, // name pass here
{
"@name": "$$this.@name",
"content": "$$this.content"
},
"$$value"
]
}
}
}
]
}
]
}
}
}
}
}
])