MongoDB使用$project计算日期差提示$dateDiff未知表达式如何解决
问题原因
$dateDiff是MongoDB 5.0版本才正式推出的日期运算表达式,如果你当前使用的MongoDB服务端版本低于5.0,就会触发「未知表达式$dateDiff」的报错,这是你遇到报错的核心原因。- 你代码中
$dateDiff的起始日期参数名写错了,官方要求的参数是startDate不是你写的start_dt,这是潜在的语法错误。 - 你的文档中
borrowers_list是数组类型,直接用$borrowers_list.borrowed_dt取到的是所有数组元素的borrowed_dt组成的集合,无法直接用于日期差计算。
解决建议
情况1:无法升级MongoDB版本(版本<5.0)
用$subtract运算符计算两个日期的毫秒差,再换算为对应单位即可:
如果仅需要计算数组第一个元素的借阅天数:
db.books.aggregate([{ $project:{ Date_diff: { $divide: [ { $subtract: [ { $arrayElemAt: ['$borrowers_list.return_dt', 0] }, { $arrayElemAt: ['$borrowers_list.borrowed_dt', 0] } ] }, 86400000 // 毫秒转天的换算系数,等同于1000*60*60*24 ] } } }])
如果需要计算数组中所有元素的借阅天数,先通过$unwind展开数组:
db.books.aggregate([ { $unwind: '$borrowers_list' }, { $project: { card_no: '$borrowers_list.card_no', Date_diff: { $divide: [ { $subtract: ['$borrowers_list.return_dt', '$borrowers_list.borrowed_dt'] }, 86400000 ] } } } ])
情况2:可以升级到MongoDB 5.0及以上版本
升级后修正参数名和数组取值问题即可正常使用$dateDiff:
db.books.aggregate([ { $unwind: '$borrowers_list' }, { $project:{ Date_diff: { $dateDiff:{ startDate:'$borrowers_list.borrowed_dt', endDate:'$borrowers_list.return_dt', unit: "day" } } } } ])
内容的提问来源于stack exchange,提问作者Rishi
相关产品推荐
相关产品推荐

