You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

MongoDB中计算字符串类型时间戳与当前时间的毫秒差

解决MongoDB字符串类型时间戳计算时间差的问题

嘿,我懂你的困扰!你遇到的问题核心是MongoDB聚合表达式里没办法直接把字符串字段通过new Date("$created_timestamp")转换成日期对象——这里的"$created_timestamp"被当成了普通字符串字面量,而不是引用集合里的字段值,所以计算出来的结果肯定不对。

正确的解决方案思路

我们需要先把字符串类型的时间戳转换成数值类型,再将其转为MongoDB可识别的Date对象,之后才能和当前时间做减法运算。具体分两步:

  1. $toLong将字符串格式的毫秒时间戳转为数值型(因为你的时间戳是毫秒级的,比如"1522950461031"
  2. $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

火山引擎 最新活动