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
相关产品推荐
相关产品推荐

