3

我们目前正在使用元数据库来分析我们的数据。我在使用聚合查询进行查询时遇到了问题。我想要 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
 }

集合中有大约 50k 个文档。

4

1 回答 1

5

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

]);
于 2017-05-04T09:14:03.113 回答