MongoDB 聚合创建日期到时间戳,然后与时间戳字段匹配

MongoDB aggregation created date to timestamp and match against timestamp field afterwards

我正在尝试将我集合的 _created_at 字段解析为时间戳,或者更确切地说,我正在向集合添加一个附加字段“时间戳”。

但是,当我得到一个时间戳(例如 3 小时前的一个)并将其放入匹配聚合中时,我仍然会得到比几天前更早的文档。我在这里做错了什么?

[
  {
    '$addFields': {
      'timestamp': {
        '$toLong': '$_created_at'
      }
    }
  }, {
    '$match': {
      'timestamp': {
        '$gte': 1648365437
      }
    }
  }
]

生成的文档包含 _created_at 3 月 22 日的值,而不是几个小时前的值。

{
  _id: "3pFlY2W5kKDDRR4Isi5AdX75"
  from_address: "0xb2c76826c8a48ed5c5a06b27911177d7cc368223"
  log_index: 215
  to_address: "0x6262998ced04146fa42253a5c0af90ca02dfd2a3"
  transaction_hash: "0xcf8ef8d4e403f66a7ac1131b5cabc7610453d0013dbd3a91f5c4172724d00ca3"
  _created_at: 2022 - 03 - 22 T20: 17: 31.903 + 00: 00
  _updated_at: 2022 - 03 - 22 T20: 19: 43.670 + 00: 00
  block_hash: "0xdc8111c1c8b4058a71b1ca98452f37ed7712c2e0ebcc8a60b4af6833e9d6b169"
  block_number: 14438210
  block_timestamp: 2022 - 03 - 22 T20: 16: 05.000 + 00: 00
  decimal: 1500.075101511569677281
  token_address: "0x7d1afa7b718fb893db30a3abc0cfc608aacfebb0"
  transaction_index: 132
  value: "1500075101511569677281"
  confirmed: true
  timestamp: 1647980251903
}

来自official document of the $toLong function,

Converts the Date into the number of milliseconds since the epoch.

因此您应该将过滤条件乘以 1000,将其转换为毫秒以进行过滤。

[
  {
    '$addFields': {
      'timestamp': {
        '$toLong': '$_created_at'
      }
    }
  }, {
    '$match': {
      'timestamp': {
        '$gte': 1648365437 * 1000
      }
    }
  }
]

附带说明一下,通常认为 anti-pattern 不要将日期时间字段存储在适当的日期对象中。考虑修改架构以将日期时间字段存储在日期而不是字符串中。