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

MongoDB聚合查询如何获取全部字段?求助解决现有语句问题

解决MongoDB聚合查询中返回全部字段的问题

嘿,我懂你的困扰——当你在MongoDB聚合里用到$group阶段时,默认只会返回你在_id里定义的分组字段,还有你明确声明的聚合计算字段(比如你的avgduration),其他原文档里的字段都会被过滤掉。下面给你几个实用的解决办法:

方法1:用$first/$last保留指定字段

如果你只需要每个分组里某几个字段的任意一个实例(比如第一个或最后一个文档的对应字段),可以在$group阶段用$first或$last操作符把需要的字段加进去:

db.lights.aggregate([
  { 
    $match: { 
      CREATE_DATE: { 
        $gte: ISODate("2018-01-24T20:05:30.000Z"), 
        $lt: ISODate("2018-02-24T20:05:30.000Z") 
      } 
    } 
  },
  { 
    $addFields: { 
      offduration: { 
        $divide: [{ $subtract: ["$RECEIVEDDATE", "$CREATE_DATE"] }, 3600000] 
      } 
    } 
  },
  { 
    "$group": { 
      _id: { SWITCHID: "$SWITCHID", STATUS: "$STATUS" }, 
      avgduration: { $avg: "$offduration" },
      // 用$first保留原文档的字段,按需添加
      CREATE_DATE: { $first: "$CREATE_DATE" },
      RECEIVEDDATE: { $first: "$RECEIVEDDATE" },
      // 其他需要的字段都可以按这个格式添加
      anyOtherField: { $first: "$anyOtherField" }
    } 
  }
])
  • $first会取分组内第一个文档的对应字段值,$last则取最后一个,适合你不关心具体取哪个实例、只要有字段值的场景。

方法2:用$push: "$$ROOT"保留所有原始文档

如果你需要保留分组内的全部完整文档,可以用$push把整个文档存入一个数组字段:

db.lights.aggregate([
  { 
    $match: { 
      CREATE_DATE: { 
        $gte: ISODate("2018-01-24T20:05:30.000Z"), 
        $lt: ISODate("2018-02-24T20:05:30.000Z") 
      } 
    } 
  },
  { 
    $addFields: { 
      offduration: { 
        $divide: [{ $subtract: ["$RECEIVEDDATE", "$CREATE_DATE"] }, 3600000] 
      } 
    } 
  },
  { 
    "$group": { 
      _id: { SWITCHID: "$SWITCHID", STATUS: "$STATUS" }, 
      avgduration: { $avg: "$offduration" },
      // 把分组内所有完整文档存入docs数组
      docs: { $push: "$$ROOT" }
    } 
  }
])
  • $$ROOT代表整个原始文档(包括你用$addFields新增的offduration字段),这样你就能在docs数组里拿到该分组下的所有完整数据。注意如果分组内文档数量很多,这个数组会占用较多内存,要根据实际场景评估。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:37:38