如何通过将数据作为参数传递来过滤unix时间戳来查询具有聚集的mongodb

问题描述

我正在通过连接到Mongodb服务器的元数据库进行查询。我要查询的字段是嵌套的,并且是Unix时间戳。见下文

{
  room_data: {
      "meta": {
        "xxx_unrecognized": null,"xxx_sizecache": 0,"id": "Hke7owir4oejq3bMf","createdat": 1565336450838,"updatedat": 1565336651548,}
   }
}

我写的查询如下

[
    {
        $match: {
            client_id: "{{client_id}}","room_data.meta.createdat": {
                $gt: "{{start}}",$lt: "{{end}}",}
        }

    },{
        $group: {

            id: "$room_data.recipe.id",count: {
                $sum: 1
            }
        }
    }
]

我没有得到任何结果,因为字段room_data.meta.createdat不是我要传递的日期(2020年8月20日)。这里的startend是参数(元数据库功能),我以日期格式传递。在将这些日期转换为unix时间戳时,我需要一些帮助,然后可以将其用于过滤特定日期之间的结果

解决方法

如果您使用的是Mongo 4.0以上版本,则可以在聚合中使用$toDate,如下所示:

db.collection.aggregate([
  {
    $match: {
      $expr: {
        $and: [
          {
            $eq: [
              "$client_id",{{client_id}}
            ]
          },{
            $lt: [
              {
                $toDate: "$room_data.meta.createdat"
              },{{end}}
            ]
          },{
            $gt: [
              {
                $toDate: "$room_data.meta.createdat"
              },{{start}}
            ]
          }
        ]
      }
    }
  }
])

MongoPlayground

如果您使用的是较旧的Mongo版本,建议您将数据库字段转换为日期类型,或者以某种方式将输入转换为数字时间戳(我不熟悉配置数据库)。 / p>

最后一个选项是使用$subtract,因为您可以从Mongo中的日期减去一个数字,然后检查该日期是在1970-01-01T00:00:00Z之前还是之后。这种方法的问题在于它没有考虑时区,因此,如果您输入的时区与数据库中的时区不同或是动态的,那么您就必须解决这个问题。

db.collection.aggregate([
  {
    $match: {
      $expr: {
        $and: [
          {
            $eq: [
              "$client_id",{
            $gt: [
              {
                "$subtract": [
                  {{end}},"$room_data.meta.createdat"
                ]
              },ISODate("1970-01-01T00:00:00.000Z")
            ]
          },{
            $lt: [
              {
                "$subtract": [
                  {{start}},ISODate("1970-01-01T00:00:00.000Z")
            ]
          }
        ]
      }
    }
  }
])

MongoPlayground

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...