2017-05-04 84 views
0

我们正在使用元数据库来分析我们的数据。我遇到了使用聚合查询进行查询的问题。我想要date1在date2之前的所有文档。 (我用了3个过滤器来调试我的结果,应该可以把它放在1个匹配滤波以后)如何比较mongo聚合框架中的两个日期?

[{ 
    "$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文件。

+0

能否请你展示了一个文档文件? – notionquest

回答

1

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

]); 
+0

我不得不使用聚合框架(通过Metabase),$哪里不是聚合框架中的东西。 –