我有一个这样的聚合查询:
...
{
'$unwind': {
path: '$modifier'
}
}, {
'$group': {
'_id': {
'date': {
'$dateToString': {
'format': '%d/%m/%Y',
'date': '$updatedTime'
}
}
},
'$$modifier': { '$sum': 1 }
}
},
...
我想使用 modifier
值,即上一阶段 ( $unwind
) 的结果,作为下一阶段 ( $group
) 的字段。详细信息如下图所示。我应该如何实现它?
MongoDB aggregation question detailed picture
当前:
这是 $unwind
阶段的输出:
updatedTime:2020-03-27T11:02:43.608+00:00
modifier:"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="ea808b878f99aa8f878b8386c4898587" rel="noreferrer noopener nofollow">[email protected]</a>"
updatedTime:2020-03-27T11:02:43.608+00:00
modifier:"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="412433282201242c20282d6f222e2c" rel="noreferrer noopener nofollow">[email protected]</a>"
这是 $group
阶段的输出:
_id: { date:"27/03/2020" }
modifier:1
预期:
$unwind
阶段的输出:
updatedTime:2020-03-27T11:02:43.608+00:00
modifier:"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="3258535f574172575f535b5e1c515d5f" rel="noreferrer noopener nofollow">[email protected]</a>"
updatedTime:2020-03-27T11:02:43.608+00:00
modifier:"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="9cf9eef5ffdcf9f1fdf5f0b2fff3f1" rel="noreferrer noopener nofollow">[email protected]</a>"
这是 $group
阶段的输出:
_id: { date:"27/03/2022" }
<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="ec868d81899fac89818d8580c28f8381" rel="noreferrer noopener nofollow">[email protected]</a>:1
<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="781d0a111b381d15191114561b1715" rel="noreferrer noopener nofollow">[email protected]</a>:1
total:2
请注意,“[email protected] ”和“[email protected] ”来自 $unwind
阶段,该阶段位于 $group
阶段之前。 total
是 modifier
(示例:“[email protected]”和“[email protected]”)值的总和。
如有任何建议,我们将不胜感激。
最佳答案
这不是直接的,但您需要按属性 date
、email
进行分组,然后仅按日期进行另一个分组并构造修饰符数组,然后将其替换为根,
$group
byupdatedTime
和modifier
并获取总计数$group
仅通过日期属性构建键值对中modifier
和count
的对象数组$arrayToObject
将该键值对转换为对象$mergeObject
合并所需的属性,例如我们将date
属性和上面的数组添加到对象操作结果$replaceRoot
替换文档根目录中的上述合并对象
{
"$group": {
"_id": {
"date": {
"$dateToString": {
"format": "%d/%m/%Y",
"date": "$updatedTime"
}
},
"modifier": "$modifier"
},
"count": { "$sum": 1 }
}
},
{
"$group": {
"_id": "$_id.date",
"modifiers": {
"$push": {
"k": "$_id.modifier",
"v": "$count"
}
},
"total": { "$sum": "$count" }
}
},
{
"$replaceRoot": {
"newRoot": {
"$mergeObjects": [
{
"date": "$_id",
"total": "$total"
},
{ "$arrayToObject": "$modifiers" }
]
}
}
}
关于node.js - MongoDB Aggregate - 如何使用前一阶段的值作为下一阶段的字段名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74849441/