Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带聚合变量的MongoDB日期数学_Mongodb_Aggregation Framework - Fatal编程技术网

带聚合变量的MongoDB日期数学

带聚合变量的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

我正在尝试构建一个集合,集合一些时间间隔(heartbeat)中未报告的内容-我需要根据存储的heartbeat计算一个值:

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