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 不要将日期时间字段存储在适当的日期对象中。考虑修改架构以将日期时间字段存储在日期而不是字符串中。
我正在尝试将我集合的 _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 不要将日期时间字段存储在适当的日期对象中。考虑修改架构以将日期时间字段存储在日期而不是字符串中。