1.需求:
有如下数据,需要将数据按照设备进行分组,然后将某个数组字段的结果进行组合去重,形成一个新的数据字段。
得到结果如:
解决方案:mongo聚合,先按设备分组,再对目标字段进行$reduce
db.device_analysis.aggregate([
{
'$match': {'时间': {'$gte':'2020年07月16日', '$lte':'2020年11月24日'}}
},
{
'$group': {'_id': '$设备编码',
'check_list': {'$addToSet': '$检查列表'},
}
},
{ "$addFields": {
"all_check_list": {
"$reduce": {
"input": "$check_list",
"initialValue": [],
"in": { "$setUnion": [ "$$value", "$$this" ]}
},
}
}
},
{'$project': {'device_code': '$_id', '_id': 0, 'all_check_list': 1, }}
])
3.$reduce相关用法延伸
3.1 $reduce语法:
{
$reduce: {
input: <array>,
initialValue: <expression>,
in: <expression>
}
}
-
input 可以是解析为数组的任何有效表达式。
如果参数解析为null或指向缺失(不存在)的字段,则$reduce
返回null。如果参数不解析为数组或null,而且也不是缺失(不存在)的字段,则$reduce
返回错误。如果input解析为空数组,则$reduce
返回 initialValue中的初始定义的数据。 -
initialValue 表达式,在in将应用于input数组的第一个元素之前设置的初始累计值。
-
in 一个合法的表达式,该表达式以从左到右的顺序应用于input数组中的每个元素。
$reverseArray
包装该input 值以产生从右到左应用组合表达式的效果。 -
value是 表示表达式的累积值的变量。
-
this是 引用正在处理的元素的变量。
3.2 示例:
{
$reduce: {
input: ["a", "b", "c"],
initialValue: "",
in: { $concat : ["$$value", "$$this"] }
}
}
结果: “abc”
{
$reduce: {
input: [ 1, 2, 3, 4 ],
initialValue: { sum: 5, product: 2 },
in: {
sum: { $add : ["$$value.sum", "$$this"] },
product: { $multiply: [ "$$value.product", "$$this" ] }
}
}
}
结果:{ “sum” : 15, “product” : 48 }
{
$reduce: {
input: [ [ 3, 4 ], [ 5, 6 ] ],
initialValue: [ 1, 2 ],
in: { $concatArrays : ["$$value", "$$this"] }
}
}
结果:[ 1, 2, 3, 4, 5, 6 ]
'$reduce': {
'input': [ [ 3, 3 ], [ 6, 6 ] ],
'initialValue': [1, 2],
'in': { '$setUnion' : ["$$value", "$$this"] }
}
}
结果: [1,2,3,6]
mongodb官方文档:https://docs.mongodb.com/manual/reference/operator/aggregation/reduce/