如何比较mongo聚合框架中的两个日期?

时间:2017-05-04 08:51:37

标签: mongodb aggregation-framework metabase

我们目前正在使用配置数据库来分析我们的数据。我遇到了使用聚合查询查询的问题。我想要date1在date2之前的所有文件。 (我使用了3个过滤器来调试我的结果,以后应该可以将它放在1个匹配过滤器中)

[{
  "$match": {
    "date1": {
      "$exists": true
     }
  }
}, {
  "$project": {
    "_id": 0,
    "date1": 1,
    "date2": 1
  }
}, {
  "$match": {
    "date1": {
        "$lt": "$date2"
    }
  }
}]

我总是没有结果。有谁可以帮我查询?

修改

文件如下:

 { 
   _id: ObjectID,
   date1: ISODate("2016-10-04T08:34:15.041Z"),
   date2: ISODate("2016-10-05T08:34:15.041Z")
   ... some more fields that are not interesting for this query
 }

该系列中约有5万份文件。

1 个答案:

答案 0 :(得分:4)

您可以使用$where来比较两个日期字段。

db.collection.find({
    $where : "this.date1 < this.date2"    
});

满足上述条件的文件将出现在结果上。如果任何没有date1date2属性的文档将不会出现在结果中。

使用汇总功能: -

$ cmp 可用于比较值。 -1表示第一个小于第二个。

需要第一个管道来消除不包含date1date2的文件

db.collection.aggregate([
{
  "$match": {
    "date1": {
      "$exists": true
     },
     "date2": {
      "$exists": true
     }
  }
},
{"$project": {
      "date1":1,
      "date2":1,
      "dateComp": {"$cmp":["$date1","$date2"]}
    }
  },
  {"$match":{"dateComp": -1}}

]);