【问题标题】:Mongodb aggregation - Match for current monthMongodb聚合 - 匹配当月
【发布时间】:2019-06-12 18:53:15
【问题描述】:

我正在定义一个 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"
            }
        }]

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

【问题讨论】:

标签: mongodb aggregation-framework


【解决方案1】:

有两种方法可以做到这一点,但如果您只需要一个子集,我建议在 $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() }},
             ]
        } 
    }
}

那么你只需要改变格式来改变比较的特异性水平。

我个人推荐第一个,因为它处理较少并且是实际的日期比较而不是字符串比较,但两者都应该工作

【讨论】:

  • 谢谢,查询有效。我遇到的问题是,由于查询存储为 JSON 并执行,因此我需要为当前日期设置动态占位符。但是 JSON 不能识别新日期或 ISODate()。我想我仍然需要修改应用程序上的查询以添加我的表达式,然后在 mongo 上执行。您是否看到任何解决方法?
  • 我认为即使是 MongoDB 扩展 JSON 也无法帮助您解决这个问题,尽管 v4.0 中有一个 $currentDate 目前仅适用于更新。除了指定要查询的日期或在将查询发送到 mongo 之前切换出您自己的占位符之外,我看不到任何其他方式。
  • 同意,最后我在查询中添加了日期占位符并在应用程序级别对其进行管理
猜你喜欢
  • 2020-06-29
  • 2019-01-24
  • 1970-01-01
  • 2013-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-06
  • 2017-08-23
相关资源
最近更新 更多