MongoDB投影中使用数学函数处理days字段绝对值不生效问题
问题原因
你现在的写法不生效是因为Node.js端的JS函数不会被传递到MongoDB中执行:你在投影对象里写Math.abs("$days")时,这段代码会直接在你的Node服务运行,传入的"$days"是个普通字符串,Math.abs处理非数字字符串会返回NaN,MongoDB识别到投影的days字段是无效值,就会直接忽略该配置返回原始字段值,所以既没效果也不会报错。
解决方案
你需要改用Mongoose的聚合查询,用MongoDB内置的$abs操作符实现字段绝对值计算,普通find的投影不支持字段运算操作。
参考代码如下:
// 把原来的Model.find(query, projection)改成聚合写法 const queryResult = await 你的集合Model.aggregate([ // 对应原来find方法的第一个查询条件参数,没有查询条件就留空对象 { $match: { /* 这里写你原来的查询过滤规则 */ } }, // 投影阶段用MongoDB内置操作符做计算 { $project: { _id : 0, userId : 1, sum : 1, days: { $abs: "$days" }, // 替换原来的Math.abs写法 leaveType : 1, reason : 1, fromDate : 1, toDate : 1, leaveDuration : 1, leaveStatus : 1, createdAt : 1, updatedAt : 1, rejectReason : 1, empName : "$userDetails.fullName", leaveType : "$LeaveDetails.leaveTitle", availableBalance : 1, } } ])
注意事项
- 所有需要在查询阶段做的字段运算、转换操作,都要使用MongoDB提供的聚合操作符,不能直接用JS原生函数。
- 聚合返回的结果是普通JS对象,不是Mongoose文档实例,如果需要用到文档实例的方法,可以后续手动调用
Model.hydrate()处理。
内容的提问来源于stack exchange,提问作者Ezad Abada
相关产品推荐
相关产品推荐

