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

如何展平MongoDB聚合结果?聚合查询结构重映射问询

展平MongoDB聚合查询结果的方法

嘿,我来帮你搞定这个聚合结果展平的问题!你现在的查询结果里VacancyId和Status都嵌套在_id对象里,想要把它们变成顶级字段和Count同级对吧?其实只需要在现有聚合管道的末尾添加一个阶段来重映射结构就行,这里有两种常用的方法:

方法1:使用$project直接指定输出字段

$project可以精确控制每个输出字段的来源,我们直接把_id里的字段提取到顶层,同时去掉原来的_id字段:

db.getCollection('apprenticeships').aggregate([
  { 
    $match: { 
      'Vacancy._id': { $in: [1, 2, 3] } 
    } 
  },
  { 
    $group: { 
      '_id': { 'VacancyId': '$Vacancy._id', 'Status': '$Status' }, 
      'Count': { $sum: 1 } 
    } 
  },
  { 
    $sort: { '_id.VacancyId': 1, '_id.Status': 1 } 
  },
  // 新增的$project阶段
  {
    $project: {
      _id: 0, // 去掉原来的_id字段
      VacancyId: "$_id.VacancyId", // 从_id里提取VacancyId到顶层
      Status: "$_id.Status", // 从_id里提取Status到顶层
      Count: 1 // 保留Count字段
    }
  }
])

方法2:使用$set+$unset组合

这种方法更直观,先把_id里的字段添加为顶级字段,再删除原来的_id:

db.getCollection('apprenticeships').aggregate([
  { 
    $match: { 
      'Vacancy._id': { $in: [1, 2, 3] } 
    } 
  },
  { 
    $group: { 
      '_id': { 'VacancyId': '$Vacancy._id', 'Status': '$Status' }, 
      'Count': { $sum: 1 } 
    } 
  },
  { 
    $sort: { '_id.VacancyId': 1, '_id.Status': 1 } 
  },
  // 新增阶段:先添加顶级字段
  { $set: {
      VacancyId: "$_id.VacancyId",
      Status: "$_id.Status"
    }
  },
  // 删除原来的_id字段
  { $unset: "_id" }
])

最终输出结果

不管用哪种方法,最终的输出结构都会变成你想要的扁平化形式:

{ "VacancyId" : 1, "Status" : 90, "Count" : 40.0 }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:24:48