我正在尝试将一个mapReduce操作转换成一个聚合管道,但是在这一步中我被阻塞了。我知道我可以使用标题中提到的运算符编写一个自定义函数,但理想情况下,我希望不用自定义聚合器来解决它。
由此:
{
field1: 'A',
field2: 'B',
field3: 'C',
statuses:[
{
key:"RECEIVED"
value:20
},{
key:"NOT_DELIVERED"
value:54
},{
key:"RECEIVED"
value:30
},{
key:"RECEIVED"
value:20
},{
key:"DELIVERED"
value:58
},{
key:"DELIVERED"
value:2
}]}我想要这个:(对于每个键,它们的值之和)
{
field1: 'A',
field2: 'B',
field3: 'C',
statuses:[
{
key:"NOT_DELIVERED"
value:54
},{
key:"RECEIVED"
value:70
},{
key:"DELIVERED"
value:60
}]}发布于 2020-10-06 12:36:14
你可以用这个:
db.collection.aggregate([
{
$set: {
statuses: {
$map: {
input: { $setUnion: "$statuses.key" },
as: "key",
in: {
key: "$$key",
status: {
$filter: {
input: "$statuses",
as: "status",
cond: { $eq: ["$$status.key", "$$key"] }
}
}
}
}
}
}
},
{
$set: {
statuses: {
$map: {
input: "$statuses",
in: { key: "$$this.key", value: { $sum: "$$this.status.value" } }
}
}
}
}
])如果您喜欢$group,那么使用这个:
db.collection.aggregate([
{ $unwind: "$statuses" },
{
$group: {
_id: { field1: "$field1", field2: "$field2", field3: "$field3", status: "$statuses.key" },
value: { $sum: "$statuses.value" }
}
},
{
$group: {
_id: { field1: "$_id.field1", field2: "$_id.field2", field3: "$_id.field3" },
statuses: { $push: { key: "$_id.status", value: "$value" } }
}
},
{ $replaceRoot: { newRoot: { $mergeObjects: ["$$ROOT", "$_id"] } } },
{ $unset: "_id" }
])https://stackoverflow.com/questions/64225578
复制相似问题