我的聚合管道中具有以下结构数组。尝试过合并对象和setUnion运算符。
{
combs:[
[
{
name:"A",
c_type:"A"
},
{
type:"visual",
severity:"Normal"
}
],
[
{
name:"B",
c_type:"B"
},
{
type:"visual",
severity:"Normal"
}
]
]
}
我期望以下结果会产生一些统计数据。请帮助我。
{
combs:[
{
name:"A",
c_type:"A",
type:"visual",
severity:"Normal"
}
{
name:"B",
c_type:"B",
type:"visual",
severity:"Normal"
}
]
}
答案 0 :(得分:4)
“没有$ unwind操作是否可以实现?”
是的。只要您以这种方式一致地映射 arrays 的结构,那么您实际上只需要管道中的一个阶段:
db.collection.aggregate([
{ "$addFields": {
"combs": {
"$map": {
"input": "$combs",
"in": { "$mergeObjects": "$$this" }
}
}
}}
])
实际上,$map
运算符在这里是一种比$unwind
更有效的方法,用于处理每个数组元素。同样,由于$mergeObjects
期望“对象数组” ,所以这实际上是数组数组的每个元素。因此,只需在数组的每个外部成员上使用{ "$mergeObjects": "$$this" }
。
从提供的数据中产生输出:
{
"_id" : ObjectId("5d8865c273375a6a4cc9e76a"),
"combs" : [
{
"name" : "A",
"c_type" : "A",
"type" : "visual",
"severity" : "Normal"
},
{
"name" : "B",
"c_type" : "B",
"type" : "visual",
"severity" : "Normal"
}
]
}
答案 1 :(得分:0)
您可以使用此聚合查询
db.collection.aggregate([
{ $unwind: "$combs" },
{ $addFields: { combs: { $mergeObjects: "$combs" }}},
{ $group: { _id: "$_id", combs: { $push: "$combs" }} }
])