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

Cor*_*hof 3 metabase mongodb aggregation-framework

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

[{
  "$match": {
    "date1": {
      "$exists": true
     }
  }
}, {
  "$project": {
    "_id": 0,
    "date1": 1,
    "date2": 1
  }
}, {
  "$match": {
    "date1": {
        "$lt": "$date2"
    }
  }
}]
Run Code Online (Sandbox Code Playgroud)

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

编辑:

文件如下所示:

 { 
   _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
 }
Run Code Online (Sandbox Code Playgroud)

集合中有大约 50k 文档。

not*_*est 5

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

db.collection.find({
    $where : "this.date1 < this.date2"    
});
Run Code Online (Sandbox Code Playgroud)

满足上述条件的文件将出现在结果中。如果任何没有属性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}}

]);
Run Code Online (Sandbox Code Playgroud)

  • 我被迫使用聚合框架(通过 Metabase), $where 不是聚合框架中的东西。 (2认同)