MongoDB select 24 小时内最后一个文档

MongoDB select last documents in 24 hours

我正在使用 MongoDB 4.4 版,我正在尝试 return 最近 24 小时内插入的最后文档,我需要 运行 这个查询一天,因此,我没有手动设置日期,我需要使用 new Date()

问题是,当我在过去 24 小时内提出更多参数时,MongoDB return 给我一条错误消息,我尝试了很多方法来解决这个问题,但是什么都没用

这是我的代码

{ 
    "$match" : { 
         "CreatedAt2" : { 
              "$gte" : ISODate("2022-04-21")
          }
     }
}

如果我 运行 这段代码,这工作正常,但如果通过 new Date() 更改字符串,问题就开始了。

在我的测试中,如果像下面这样只放置 new Date() 并通过“$lte”查找,代码运行良好。

'$lte' 只是检查 new Date() 是否有效

"CreatedAt2" :  {  $lte: new Date() }

因此,如果在过去 24 小时内尝试将值包含在 return 中,我的查询不起作用,请看下面

"CreatedAt2" :  {  $gte: new Date(new Date().getTime() - 86400000) }

MongoDB给我带来这个错误信息

现在我不知道我需要做什么来解决这个问题。

试试这个

"createdAt2":{$gte:new Date(Date.now() - 86400)

这应该可以正常工作

考虑利用 $$NOW 聚合变量并 $subtract 它通过 24 小时 * 60 分钟 * 60 秒 * 1000 毫秒 = 86400000 毫秒来获取 24 小时内的记录

db.collection.aggregate([
  {
    "$match": {
      $expr: {
        $gte: [
          "$CreatedAt2",
          {
            "$subtract": [
              "$$NOW",
              86400000
            ]
          }
        ]
      }
    }
  }
])

这里是Mongo playground供大家参考。

除了减去 86400000 毫秒,您还可以使用

db.collection.aggregate([
  {
    "$match": {
      $expr: {
        $gte: [
          "$CreatedAt2",
          {
             $dateSubtract: {
                startDate: "$$NOW",
                unit: "hour",
                amount: 24
             }
           }     
        ]
      }
    }
  }
])

或使用第三方 date-library,例如moment.js

{ 
    "$match" : { 
         "CreatedAt2" : { 
              "$gte" : moment().subtract(24, 'hours').toDate()
          }
     }
}