首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Mongodb聚合-匹配当月

Mongodb聚合-匹配当月
EN

Stack Overflow用户
提问于 2019-06-13 02:53:15
回答 1查看 1K关注 0票数 0

我正在定义一个mongodb聚合表达式,它将存储在JSON中并执行。当前的聚合表达式大多是简单的分组和投影。

例如,下面是用于在后续日期分组的聚合查询

代码语言:javascript
复制
[{
            "$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"
            }
        }]

在这个聚合表达式中,我想添加基于动态日期的筛选器,它允许我仅获取当前月份或当前月份的日期。

例如

代码语言:javascript
复制
[{
            "$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"
            }
        }]

有没有办法添加动态日期过滤器?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-13 07:27:54

有两种方法可以做到这一点,不过对于这两种方法,我建议在$group阶段之前执行初始$match,以便在只需要流水线的一个子集的情况下限制流经管道其余部分的数据量。

最简单的方法可能是预先计算出您想要查询的日期,因此您感兴趣的特定日期或月份的开始/结束日期,并对其进行比较检查:

代码语言:javascript
复制
{
    '$match': {
        '$data.follow_up_date': {
            '$lte': ...
            '$gte': ...
        }
    }
}

否则,您可以使用$expr获取后续日期和当前日期,并比较一些格式化的值,因此:

代码语言:javascript
复制
{
    '$match': {
        '$expr': {
            '$eq': [
                { "$dateToString": { format: "%Y-%m-%d", date: "$data.follow_up_date" }},
                { "$dateToString": { format: "%Y-%m-%d", date: new Date() }},
             ]
        } 
    }
}

然后,您只需更改格式以更改比较的特异性级别。

就我个人而言,我推荐第一种方法,因为它的处理较少,而且是一个实际的日期比较,而不是字符串比较,但这两种方法都应该可以工作

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56568666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档