如何通过将数据作为参数传递来过滤 unix 时间戳来使用聚合查询 mongodb

How do I query mongodb with aggregration by passing data as a parameter to filter unix time stamp

我正在通过连接到 Mongodb 服务器的 Metabase 进行查询。我正在查询的字段是嵌套的并且是一个 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 版本,我建议您将数据库字段转换为日期类型,或者以某种方式将输入转换为数字时间戳(我是不熟悉配置数据库)。

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

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

MongoPlayground