在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")
}
答案 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")
}