You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mongo聚合及字段操作:如何将ISODate转换为Unix时间戳?

嘿,这个需求我太熟了!不管是普通查询还是聚合操作,MongoDB都有很简便的方法实现ISODate到Unix时间戳(毫秒级,就是你例子里的1522440365739)的转换,给你拆解两种场景:

普通查询中转换ISODate为Unix时间戳

MongoDB里的ISODate本质就是JavaScript的Date对象,所以直接调用它的getTime()方法就能拿到毫秒级时间戳。你可以用$let来封装这个操作,或者更简洁的$toLong运算符:

  • 方法一:使用getTime()
db.yourCollection.find(
  {}, // 查询条件,留空查所有
  {
    _id: 0, // 可选,不想返回_id就加上
    timestamp: { $let: { vars: { dt: "$yourISODateField" }, in: "$$dt.getTime()" } }
  }
)
  • 方法二:使用$toLong(更简洁)
    $toLong会直接把Date类型转换成对应的毫秒级时间戳数值,和getTime()结果完全一致:
db.yourCollection.find(
  {},
  {
    _id: 0,
    timestamp: { $toLong: "$yourISODateField" }
  }
)
聚合操作中的转换方法

聚合阶段里同样有多种方式,最常用的是下面两种:

方式一:用$toLong快速转换

这是聚合里最直观的写法,和普通查询里的用法一致:

db.yourCollection.aggregate([
  {
    $project: {
      _id: 0,
      timestamp: { $toLong: "$yourISODateField" }
    }
  }
])

方式二:用$add隐式转换

MongoDB在聚合中会把Date对象和数值相加时,自动转换成毫秒级时间戳,所以加0就能得到结果:

db.yourCollection.aggregate([
  {
    $project: {
      _id: 0,
      timestamp: { $add: ["$yourISODateField", 0] }
    }
  }
])

额外补充:如果需要秒级时间戳

要是你想要秒级的时间戳(比如1522440365),只需要把毫秒数除以1000再取整就行:

db.yourCollection.aggregate([
  {
    $project: {
      _id: 0,
      timestampSec: { $floor: { $divide: [{ $toLong: "$yourISODateField" }, 1000] } }
    }
  }
])

这些方法都是我日常开发中常用的,亲测有效,你可以根据自己的场景选最顺手的~

内容的提问来源于stack exchange,提问作者magicgregz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:22:25