在Mongo DB中获取整个日期集合,即使其中有一个匹配

时间:2016-07-26 14:03:14

标签: mongodb mongodb-query

在Mongo DB中获取整个日期集合,即使其中有一个匹配。

使用以下数据创建新集合:

db.details.insert({
    "_id": 1,
    "name": "johnson",
    "dates": [
        {"date": ISODate("2016-05-01")},
        {"date": ISODate("2016-08-01")}
    ]
})

取回:

db.details.find().pretty()

输出:

{
    "_id": 1,
    "name": "Johnson",
    "dates": [
        {"date": ISODate("2016-05-01T00:00:00Z")},
        {"date": ISODate("2016-08-01T00:00:00Z")}
    ]
}

所以这里有一个名为日期的集合,在另一个集合细节中。

现在我想使用大于过滤日期内的日期,并希望结果显示"2016-08-01"

但是当我搜索如下内容时:

db.details.find(
    {"dates.date": {$gt: ISODate("2016-07-01")}},
    {"dates.date": 1, "_id": 0}
).pretty()

获得如下结果,即使其中有一个日期匹配,它也会给我整个集合:

{
    "dates": [
        {"date": ISODate("2016-05-01T00:00:00Z")},
        {"date": ISODate("2016-08-01T00:00:00Z")}
    ]
}

请帮助获取预期数据,即:

{
  "date": ISODate("2016-08-01T00:00:00Z")
}

1 个答案:

答案 0 :(得分:0)

您可以使用聚合框架:

db.details.aggregate([
    {$unwind: '$dates'},
    {$match: {'dates.date': {$gt: ISODate("2016-07-01")}}}, 
    {$project: {_id: 0, 'dates.date': 1}}
]);

另一种方式(仅适用于mongo 3.2):

db.details.aggregate([
    {$project: {
        _id: 0, 
        dates: {
            $filter: {
                input: '$dates', 
                as: 'item', 
                cond: {
                    $gte: ['$$item.date', ISODate('2016-08-01T00:00:00Z')]
                }
            }
        }
    }
}]);

仅返回日期字段:

db.details.aggregate([
    {$unwind: '$dates'},
    {$match: {'dates.date': {$gt: ISODate('2016-07-01')}}}, 
    {$group: {_id: '$dates.date'}}, 
    {$project: {_id: 0, date: '$_id'}}
]);

返回:

{ 
  "date" : ISODate("2016-08-01T00:00:00Z") 
}