Kri*_*Dev 5 mongodb node.js mongodb-query aggregation-framework
我的聚合管道中具有以下结构数组。尝试合并对象和setUnion运算符。
{
combs:[
[
{
name:"A",
c_type:"A"
},
{
type:"visual",
severity:"Normal"
}
],
[
{
name:"B",
c_type:"B"
},
{
type:"visual",
severity:"Normal"
}
]
]
}
Run Code Online (Sandbox Code Playgroud)
我期望以下结果能产生一些统计数据。请帮我。
{
combs:[
{
name:"A",
c_type:"A",
type:"visual",
severity:"Normal"
}
{
name:"B",
c_type:"B",
type:"visual",
severity:"Normal"
}
]
}
Run Code Online (Sandbox Code Playgroud)
“是否可以不用$unwind操作来实现?”
嗯,是。只要您的数组数组结构始终以这种方式映射,那么您实际上只需要管道中的一个阶段:
db.collection.aggregate([
{ "$addFields": {
"combs": {
"$map": {
"input": "$combs",
"in": { "$mergeObjects": "$$this" }
}
}
}}
])
Run Code Online (Sandbox Code Playgroud)
因此,实际上,$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"
}
]
}
Run Code Online (Sandbox Code Playgroud)
一般来说,您应该始终优先选择内联处理器(例如$map其他数组运算符)而不是$unwind适用的地方。
| 归档时间: |
|
| 查看次数: |
71 次 |
| 最近记录: |