在Mongoose聚合查询中如何引用$group阶段内已计算的字段值
错误原因
MongoDB 聚合管道的同一阶段内无法引用当前阶段新计算出的字段,同阶段所有字段的计算是并行执行的,不存在先后依赖关系,因此你在$group阶段中刚定义的timeStart、timeLatest无法在同一个$group的timeLength中直接通过$符引用。此外你原有代码的$subtract参数也存在语法错误,两个字段被误写进了同一个字符串。
正确实现方案
方案1(推荐):拆分聚合阶段
将字段计算拆分到两个阶段,第一个$group阶段先统计出最小、最大时间,第二个$addFields阶段基于前序阶段的计算结果求时间差,后续维护逻辑只需要改一处即可。
const aggregate = await Model.aggregate([ { $group: { _id: { id: `$id` }, timeStart: { $min: `$aTime` }, timeLatest: { $max: `$aTime` } } }, { $addFields: { timeLength: { $subtract: [`$timeLatest`, `$timeStart`] } } } ]);
方案2:同阶段重复计算逻辑
如果不想新增阶段,也可以在同一个$group阶段重复写统计逻辑,直接基于原始字段计算差值,但是该方式会产生重复计算,后期维护成本更高。
const aggregate = await Model.aggregate([ { $group: { _id: { id: `$id` }, timeStart: { $min: `$aTime` }, timeLatest: { $max: `$aTime` }, timeLength: { $subtract: [{ $max: `$aTime` }, { $min: `$aTime` }] } } } ]);
内容的提问来源于stack exchange,提问作者Cheetara
相关产品推荐
相关产品推荐

