You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB聚合:如何将聚合结果的值转为键合并为单文档?

实现MongoDB聚合结果的结构转换

当然可以实现这个结构转换!你只需要在现有聚合管道的基础上补充几个阶段,就能把多文档数组转换成以_id为键的单文档。

完整的聚合查询

collection.aggregate([
  // 保留原有处理trendingStats默认值的阶段
  {
    $project: {
      'trendingStats': {
        '$ifNull': ['$trendingStats', {'trendingArr': [], 'trendingScore': 0}]
      }
    }
  },
  // 将所有文档分组为一个集合,收集_id和对应的trendingStats
  {
    $group: {
      _id: null,
      docs: {
        $push: {
          k: '$_id', // 用原文档的_id作为对象的键
          v: '$trendingStats' // 对应的value是处理后的trendingStats
        }
      }
    }
  },
  // 将数组转换为对象,并替换根文档
  {
    $replaceRoot: {
      newRoot: { $arrayToObject: '$docs' }
    }
  }
]);

各阶段作用解释

  • $project阶段:和你原来的逻辑一致,确保每个文档的trendingStats字段都有值,不存在的话就用默认的空数组和0分的结构填充。
  • $group阶段:通过_id: null把所有聚合后的文档合并成一组,然后用$push把每个文档的_id(作为键k)和trendingStats(作为值v)收集成一个数组。
  • $replaceRoot + $arrayToObject阶段:$arrayToObject会把docs数组里的k-v结构转换成对象,再通过$replaceRoot把这个对象作为最终的根文档返回,就得到了你想要的格式。

最终输出结果

{
  "5a9433fee5878a000f7cba09": {"trendingArr": [], "trendingScore": 0},
  "5a942f79e5878a000f7cba06": {"trendingArr": [], "trendingScore": 0}
}

内容的提问来源于stack exchange,提问作者user3302146

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 06:31:08