我正在定义一个mongodb聚合表达式,它将存储在JSON中并执行。当前的聚合表达式大多是简单的分组和投影。
例如,下面是用于在后续日期分组的聚合查询
[{
"$group": {
"_id": {
"day_of_month": {
"$dayOfMonth": "$data.follow_up_date"
},
"month": {
"$month": "$data.follow_up_date"
},
"year": {
"$year": "$data.follow_up_date"
}
},
"total_leads": {
"$sum": 1
},
"total_loan_amount": {
"$sum": "$data.loan_amount"
},
"follow_up_date": {
"$push": "$data.follow_up_date"
},
"data": {
"$push": "$data"
}
}
},
{
"$project": {
"_id": 1,
"day_of_month": "$_id.day_of_month",
"month": "$_id.month",
"year": "$_id.year",
"total_leads": "$total_leads",
"total_loan_amount": "$total_loan_amount",
"follow_up_date": {
"$arrayElemAt": ["$follow_up_date", 0]
},
"data": "$data"
}
}]
在这个聚合表达式中,我想添加基于动态日期的筛选器,它允许我仅获取当前月份或当前月份的日期。
例如
[{
"$group": {
"_id": {
"day_of_month": {
"$dayOfMonth": "$data.follow_up_date"
},
"month": {
"$month": "$data.follow_up_date"
},
"year": {
"$year": "$data.follow_up_date"
}
},
"total_leads": {
"$sum": 1
},
"total_loan_amount": {
"$sum": "$data.loan_amount"
},
"follow_up_date": {
"$push": "$data.follow_up_date"
},
"data": {
"$push": "$data"
}
}
},
{
//something like this
"_id.day_of_month" : {$month : new Date()}
},
{
"$project": {
"_id": 1,
"day_of_month": "$_id.day_of_month",
"month": "$_id.month",
"year": "$_id.year",
"total_leads": "$total_leads",
"total_loan_amount": "$total_loan_amount",
"follow_up_date": {
"$arrayElemAt": ["$follow_up_date", 0]
},
"data": "$data"
}
}]
有没有办法添加动态日期过滤器?
发布于 2019-06-13 07:27:54
有两种方法可以做到这一点,不过对于这两种方法,我建议在$group
阶段之前执行初始$match
,以便在只需要流水线的一个子集的情况下限制流经管道其余部分的数据量。
最简单的方法可能是预先计算出您想要查询的日期,因此您感兴趣的特定日期或月份的开始/结束日期,并对其进行比较检查:
{
'$match': {
'$data.follow_up_date': {
'$lte': ...
'$gte': ...
}
}
}
否则,您可以使用$expr
获取后续日期和当前日期,并比较一些格式化的值,因此:
{
'$match': {
'$expr': {
'$eq': [
{ "$dateToString": { format: "%Y-%m-%d", date: "$data.follow_up_date" }},
{ "$dateToString": { format: "%Y-%m-%d", date: new Date() }},
]
}
}
}
然后,您只需更改格式以更改比较的特异性级别。
就我个人而言,我推荐第一种方法,因为它的处理较少,而且是一个实际的日期比较,而不是字符串比较,但这两种方法都应该可以工作
https://stackoverflow.com/questions/56568666
复制相似问题