这就是我收藏的样子。
{ "name" : "Lorem", "createdate" : ISODate("2018-09-12T04:02:41.208Z")},
{ "name" : "Impusom", "createdate" : ISODate("2018-09-12T04:02:41.208Z")}
{ "name" : "Lorem", "createdate" : ISODate("2018-11-01T04:02:41.208Z")}
{ "name" : "Damut", "createdate" : ISODate("2018-11-12T04:02:41.208Z")}
{ "name" : "Remetat", "createdate" : ISODate("2019-01-01T04:02:41.208Z")}
我想提取不同的createdate
值,以便可以在日历小部件上对其进行标记。我想忽略时间。
这是我当前正在使用的管道。
db.mycollection.aggregate({
'$project': {
'y': {
'$year': '$createdate'
},
'm': {
'$month': '$createdate'
},
'd': {
'$dayOfMonth': '$createdate'
}
}
}, {
'$group': {
'_id': {
'year': '$y',
'month': '$m',
'day': '$d'
}
}
}, {
'$sort': {
'_id.year': 1,
'_id.month': 1,
'_id.day': 1
},
})
结果看起来像这样
{
"_id" : {
"year" : 2019,
"month" : 1,
"day" : 1
}
},
{
"_id" : {
"year" : 2018,
"month" : 11,
"day" : 12
}
},
{
"_id" : {
"year" : 2018,
"month" : 11,
"day" : 1
}
},
{
"_id" : {
"year" : 2018,
"month" : 9,
"day" : 12
}
}
我希望改进查询并将数据限制为特定年份。例如2018
因此,我尝试在$project
之前添加匹配条件
{ '$match': { "createdate":{ "$gte": ISODate("2017-12-31T18:30:00.000Z"), "$lt": ISODate("2018-12-31T18:30:00.000Z") } }
},
结果仅限于2018年,但是$group
停止工作,因此我得到了日期的重复记录。
我尝试将$match
后的$sort
选项移到允许$group
起作用但不应用$match
条件的地方。
我非常感谢朝着正确方向前进。
更新---
因此上述具有$ match条件的查询在mongoplayground.net中有效 但不是我的猫鼬代码。
const pipeline = [{
"$match": {
"createdate": {
"$gte": moment().startOf('year'),
"$lt": moment().endOf('year'),
}
}
},{
'$project': {
'y': {
'$year': '$createdate'
},
'm': {
'$month': '$createdate'
},
'd': {
'$dayOfMonth': '$createdate'
}
}
}, {
'$group': {
'_id': {
'year': '$y',
'month': '$m',
'day': '$d'
}
}
}, {
'$sort': {
'_id.year': 1,
'_id.month': 1,
'_id.day': 1
},
}];
Collection.aggregate(pipeline, (err, dates) => { res.json({ data: dates }); });
响应返回空数组。
答案 0 :(得分:1)
将您的$match
部分更改为:
"$match": {
"createdate": {
"$gte": moment().startOf('year').toDate(),
"$lt": moment().endOf('year').toDate(),
}
}
然后查看是否有帮助。我认为moment
不能用作有效的日期参数