Mongoose聚合查询问题:查询timeSpent大于timeBilled的任务无结果
解决Mongoose聚合查询字段比较的问题
你当前的查询无法得到预期结果的核心原因是:在$match阶段的普通查询条件中,$gt这类操作符不能直接引用其他字段,必须使用$expr包裹聚合表达式,才能实现字段间的数值比较。另外还要考虑部分文档缺少timeSpent或timeBilled字段的情况,避免这些文档干扰查询结果。
方案1:仅筛选同时存在两个字段的文档
如果只需要处理同时包含timeSpent和timeBilled的任务,先通过$exists过滤掉缺失字段的文档,再用$expr完成字段比较:
myTaskSchema.aggregate([ { $match: { timeSpent: { $exists: true }, timeBilled: { $exists: true }, $expr: { $gt: ['$timeSpent', '$timeBilled'] } } } ]) .then(data => { console.log(data) })
方案2:处理缺失字段的情况
如果需要将缺失timeSpent或timeBilled的字段视为0(或其他自定义默认值)进行比较,可以使用$ifNull填充默认值:
myTaskSchema.aggregate([ { $match: { $expr: { $gt: [ { $ifNull: ['$timeSpent', 0] }, { $ifNull: ['$timeBilled', 0] } ] } } } ])
关键说明
$expr允许在查询条件中使用聚合管道表达式,这样就能引用文档中的其他字段进行计算和比较。$exists用于过滤出包含指定字段的文档,避免因字段缺失导致的比较逻辑异常。$ifNull会判断字段是否存在,若不存在则使用指定的默认值替代,保证比较逻辑能覆盖所有文档。
内容的提问来源于stack exchange,提问作者Scott Barrar
相关产品推荐
相关产品推荐

