Mongodb聚合使用epoch当前时间戳获取过期记录
Mongodb aggregate get the expired records by using the epoch current timestamp
{
"id" : "58",
"topicHeader" : {
"replayData" : {
"messageDateInms" : NumberLong(1649448201357),
"messageDelayInms" : NumberLong(600000)
}
},
"status" : "IN_PROGRESS"
},
{
"id" : "59",
"topicHeader" : {
"replayData" : {
"messageDateInms" : NumberLong(1650220023677),
"messageDelayInms" : NumberLong(600000)
}
},
"status" : "IN_IROGRESS"
}
我需要根据当前纪元时间戳获取过期记录,即
(topicHeader.replayData.messageDateInms + topicHeader.replayData.messageDelayInms) <= epoch current timestamp
我可以使用 find() 来解决问题,但我正在尝试找到更好的解决方案,因此它不会导致任何性能问题:
db.getCollection("col1").find
({
$expr: {
$lte: [{ "$add": ["$topicHeader.replayData.messageDateInms", "$topicHeader.replayData.messageDelayInms"] }, 1650226443611]
}
})
提前致谢。
使用$add
总结2个字段。使用 $toDate
将它们转换为 date
字段并与 $$NOW
进行比较
db.collection.aggregate([
{
"$match": {
$expr: {
$lte: [
{
$toDate: {
"$add": [
"$topicHeader.replayData.messageDateInms",
"$topicHeader.replayData.messageDelayInms"
]
}
},
"$$NOW"
]
}
}
}
])
这里是Mongo playground供您参考。
{
"id" : "58",
"topicHeader" : {
"replayData" : {
"messageDateInms" : NumberLong(1649448201357),
"messageDelayInms" : NumberLong(600000)
}
},
"status" : "IN_PROGRESS"
},
{
"id" : "59",
"topicHeader" : {
"replayData" : {
"messageDateInms" : NumberLong(1650220023677),
"messageDelayInms" : NumberLong(600000)
}
},
"status" : "IN_IROGRESS"
}
我需要根据当前纪元时间戳获取过期记录,即
(topicHeader.replayData.messageDateInms + topicHeader.replayData.messageDelayInms) <= epoch current timestamp
我可以使用 find() 来解决问题,但我正在尝试找到更好的解决方案,因此它不会导致任何性能问题:
db.getCollection("col1").find
({
$expr: {
$lte: [{ "$add": ["$topicHeader.replayData.messageDateInms", "$topicHeader.replayData.messageDelayInms"] }, 1650226443611]
}
})
提前致谢。
使用$add
总结2个字段。使用 $toDate
将它们转换为 date
字段并与 $$NOW
db.collection.aggregate([
{
"$match": {
$expr: {
$lte: [
{
$toDate: {
"$add": [
"$topicHeader.replayData.messageDateInms",
"$topicHeader.replayData.messageDelayInms"
]
}
},
"$$NOW"
]
}
}
}
])
这里是Mongo playground供您参考。