带聚合变量的MongoDB日期数学
我正在尝试构建一个集合,集合一些时间间隔(heartbeat)中未报告的内容-我需要根据存储的heartbeat计算一个值:带聚合变量的MongoDB日期数学,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我正在尝试构建一个集合,集合一些时间间隔(heartbeat)中未报告的内容-我需要根据存储的heartbeat计算一个值: db.things.aggregate([ {$project: {"lastmsg":1, "props.settings":1}}, {$unwind: "$props.settings"}, {$project: { _id:0, "lastmsg": "$lastmsg", "heartbeat": {$multiply
db.things.aggregate([
{$project: {"lastmsg":1, "props.settings":1}},
{$unwind: "$props.settings"},
{$project: {
_id:0,
"lastmsg": "$lastmsg",
"heartbeat": {$multiply: [{$toInt: "$props.settings.heartbeat"},2000]},
"now": new Date(), "subtracted": new Date(new Date().getTime()- "$heartbeat")
}
}
])
{ $match: { "lastmsg":{$gte: "$subtracted")}
返回的结果如下所示:
{ "lastmsg" : ISODate("2020-04-23T12:41:37.667Z"), "heartbeat" : 240000, "now" : ISODate("2020-05-14T16:26:11.824Z"), "subtracted" : ISODate("1970-01-01T00:00:00Z") }
{ "lastmsg" : ISODate("2020-05-14T16:24:24.228Z"), "heartbeat" : 240000, "now" : ISODate("2020-05-14T16:26:11.824Z"), "subtracted" : ISODate("1970-01-01T00:00:00Z") }
“减法”投影未按预期进行日期计算。我可以插入一个特定的数字,它的工作,但这违背了目的
作为最后一步,我将进行匹配,看看这些东西中有哪些在心跳间隔内没有检入:
db.things.aggregate([
{$project: {"lastmsg":1, "props.settings":1}},
{$unwind: "$props.settings"},
{$project: {
_id:0,
"lastmsg": "$lastmsg",
"heartbeat": {$multiply: [{$toInt: "$props.settings.heartbeat"},2000]},
"now": new Date(), "subtracted": new Date(new Date().getTime()- "$heartbeat")
}
}
])
{ $match: { "lastmsg":{$gte: "$subtracted")}
非常感谢您的帮助……我不知道您的数据是什么样子(您应该发布数据以提供帮助),但我认为这可以解决问题。
您可以使用
$$NOW
变量,该变量以ISODate
格式返回当前日期
测试数据:
[
{
"lastmsg": ISODate("2020-04-23T12:41:37.667Z"),
"heartbeat": 240000
},
{
"lastmsg": ISODate("2020-05-14T16:24:24.228Z"),
"heartbeat": 240000
}
]
db.collection.aggregate([
{
$addFields: {
"now": "$$NOW",
"subtracted": {
$subtract: [
"$$NOW",
"$heartbeat"
]
}
}
},
{
$match: {
"lastmg": {
$gte: "$subtracted"
}
}
}
])
查询:
[
{
"lastmsg": ISODate("2020-04-23T12:41:37.667Z"),
"heartbeat": 240000
},
{
"lastmsg": ISODate("2020-05-14T16:24:24.228Z"),
"heartbeat": 240000
}
]
db.collection.aggregate([
{
$addFields: {
"now": "$$NOW",
"subtracted": {
$subtract: [
"$$NOW",
"$heartbeat"
]
}
}
},
{
$match: {
"lastmg": {
$gte: "$subtracted"
}
}
}
])
显然,Mongo 4.0.10上不提供此功能-现在没有访问$$的权限,但将尝试使用addFields和/或$Subtract来构建此功能,并使用日期减法实现我想要的功能,谢谢!!是的,
$subtract
也适用于日期字段。很高兴我帮了你:D