MongoDB中计算字符串类型时间戳与当前时间的毫秒差
解决MongoDB字符串类型时间戳计算时间差的问题
嘿,我懂你的困扰!你遇到的问题核心是MongoDB聚合表达式里没办法直接把字符串字段通过new Date("$created_timestamp")转换成日期对象——这里的"$created_timestamp"被当成了普通字符串字面量,而不是引用集合里的字段值,所以计算出来的结果肯定不对。
正确的解决方案思路
我们需要先把字符串类型的时间戳转换成数值类型,再将其转为MongoDB可识别的Date对象,之后才能和当前时间做减法运算。具体分两步:
- 用
$toLong将字符串格式的毫秒时间戳转为数值型(因为你的时间戳是毫秒级的,比如"1522950461031") - 用
$toDate将数值型时间戳转为Date对象
修正后的聚合查询
db.getCollection('testEntity').aggregate([ {$match : {"_id" : "123456789"}}, {$project: { _id : 1, created_timestamp: 1, // 计算时间差,结果为毫秒数 dateDifference: { $subtract: [ new Date(), // 获取当前时间的Date对象 { $toDate: { $toLong: "$created_timestamp" } } // 转换字符串时间戳为Date ] }, // 可选:转换成秒数更易读 dateDifferenceInSeconds: { $divide: [ {$subtract: [new Date(), { $toDate: { $toLong: "$created_timestamp" } }]}, 1000 ] } }} ])
为什么这样能行?
$toLong会把字符串形式的时间戳(比如"1522950461031")转换成MongoDB能处理的数值类型$toDate接收毫秒级数值时间戳,返回对应的Date对象- 最后
$subtract对两个Date对象做减法,得到的结果是两者之间的毫秒差,完全符合你要的「已流逝时间」需求
内容的提问来源于stack exchange,提问作者Bajal




