保留由$group崩溃的字段



我想通过计算一个名为code的字段来汇总一组文档。如何总结我的数据并保留原始文档中的详细信息?

管道输入包含以下文档。

{ 
"_id" : ObjectId("5ff38e0eb09dec2cbce14760"), 
"code" : "U", 
"date" : ISODate("2021-04-09T00:00:00.000+0000"), 
"full_day" : false, 
"remote" : false, 
"student_id" : 9441
}
{ 
"_id" : ObjectId("5ff38e0eb09dec2cbce14807"), 
"code" : "E", 
"date" : ISODate("2020-11-02T00:00:00.000+0000"), 
"full_day" : false, 
"remote" : false, 
"student_id" : 9441
}
{ 
"_id" : ObjectId("5ff39854b09dec2cbce1494c"), 
"code" : "E", 
"date" : ISODate("2020-11-03T08:00:00.000+0000"), 
"full_day" : true, 
"remote" : false, 
"student_id" : 9441
}

所需的输出按code分组,将student_id提升到根级别,并将其他细节嵌套在details数组中:

{ 
"code" : "U",
"student_id": 9441, 
"count" : 1.0, 
"details" : [
{
"date" : ISODate("2021-04-09T00:00:00.000+0000"), 
"full_day" : false, 
"remote" : false, 
}
]
}
{ 
"code" : "E",
"student_id": 9441, 
"count" : 2.0, 
"details" : [
{
"date" : ISODate("2020-11-02T00:00:00.000+0000"), 
"full_day" : false, 
"remote" : false, 
}, 
{
"date" : ISODate("2020-11-03T08:00:00.000+0000"), 
"full_day" : true, 
"remote" : false, 
}
]
}

结合$group$push,我只能产生:

{ 
"_id" : "U", 
"count" : 1.0, 
"details" : [
{
"date" : ISODate("2021-04-09T00:00:00.000+0000"), 
"full_day" : false, 
"remote" : false, 
"student_id" : 9441
}
]
}
{ 
"_id" : "E", 
"count" : 2.0, 
"details" : [
{
"date" : ISODate("2020-11-02T00:00:00.000+0000"), 
"full_day" : false, 
"remote" : false, 
"student_id" : 9441
}, 
{
"date" : ISODate("2020-11-03T08:00:00.000+0000"), 
"full_day" : true, 
"remote" : false, 
"student_id" : 9441.0
}
]
}

以上结果是通过以下管道实现的:

[
{ 
"$match" : { 
"student_id" : 9441.0
}
}, 
{ 
"$group" : { 
"_id" : "$code", 
"count" : { 
"$sum" : 1.0
}, 
"details" : { 
"$push" : { 
"date" : "$date", 
"full_day" : "$full_day", 
"remote" : "$remote", 
"student_id" : "$student_id"
}
}
}
}, 
{ 
"$addFields" : { 
"student_id" : "$student_id"
}
}
]

如果希望所有输入文档都具有相同的字段值,并希望该字段包含在$group输出中,请使用$first累积运算符:

{ 
"$group" : { 
"_id" : "$code", 
"student_id" : {$first: "$student_id"},
"count" : { 
"$sum" : 1.0
}, 
"details" : { 
"$push" : { 
"date" : "$date", 
"full_day" : "$full_day", 
"remote" : "$remote"
}
}
}
}

如果需要将_id重命名回code,请在组后使用$project阶段。

最新更新