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

Posted

技术标签:

【中文标题】如何通过将数据作为参数传递以过滤 unix 时间戳来查询具有聚合的 mongodb【英文标题】:How do I query mongodb with aggregration by passing data as a parameter to filter unix time stamp 【发布时间】:2020-08-20 13:46:25 【问题描述】:

我正在通过连接到 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 是我的参数(元数据库功能) m 传入日期格式。我需要一些帮助来将这些日期转换为 unix 时间戳,然后可以使用它来过滤掉特定日期之间的结果

【问题讨论】:

【参考方案1】:

如果您使用的是 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 版本,我建议您将数据库字段转换为 Date 类型,或者以某种方式将输入转换为数字时间戳(我不熟悉元数据库)。

最后一个选项是使用$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

【讨论】:

以上是关于如何通过将数据作为参数传递以过滤 unix 时间戳来查询具有聚合的 mongodb的主要内容,如果未能解决你的问题,请参考以下文章

如何从 postgres 获取时间戳作为 Unix 纪元?

将时间戳传递给 azure 映射数据流

如何将 select 语句的 IN 子句中的参数作为具有多个值的参数传递?

如何在 SQLAlchemy 的过滤条件中传递模型参数

如何将 C 中的 unix 时间戳作为 int 获取?

Delphi x64:如何将本地过程作为过程参数(回调)传递