node.js - MongoDB Aggregate - 如何使用前一阶段的值作为下一阶段的字段名称?

标签 node.js mongodb mongoose aggregation-framework aggregate

我有一个这样的聚合查询:

...
{
    '$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 阶段之前。 totalmodifier (示例:“[email protected]”和“[email protected]”)值的总和。 如有任何建议,我们将不胜感激。

最佳答案

这不是直接的,但您需要按属性 dateemail 进行分组,然后仅按日期进行另一个分组并构造修饰符数组,然后将其替换为根,

  • $group by updatedTimemodifier 并获取总计数
  • $group仅通过日期属性构建键值对中modifiercount的对象数组
  • $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/

相关文章:

javascript - 如何测试纯 Vue 组件(不是单个文件组件)

javascript - 如何向mongodb中插入数据

mongodb - MongoDB中如何保证游标不返回重复文档?

javascript - 如何在 Mongoose 中包含外部模型?

node.js - 如何正确使用迁移

javascript - Node JS 异步库系列

node.js - 当应用程序重新启动时,NEDB 正在清除文件内容

java - 需要在Java中使用eclipse获取MongoDB中的一个字段

javascript - 确定 Mongoose 中空数组和未定义数组之间的区别

node.js - 如何在没有回调的情况下返回 Mongoose 查询结果