如何在Mongo聚合框架中比较两个日期?

4
我们目前正在使用Metabase来分析我们的数据。我在使用聚合查询时遇到了一个问题。我想要查询所有日期1在日期2之前的文档。(我使用了3个过滤器来调试我的结果,后面应该可以将它们放入一个匹配过滤器中。)
[{
  "$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万份文档。


请问您能否提供一个样例文档? - notionquest
1个回答

6
您可以使用$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}}

]);

2
我被迫使用集合框架(由Metabase提供),$where在集合框架中并不存在。 - Corne Elshof

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接