Metabase Pulse中MongoDB查询动态日期函数实现咨询
解决Metabase中Mongo查询自动计算近N天日期并配置每日Pulse邮件的问题
我来帮你搞定这个动态日期计算的问题!你之前尝试的$currentDate()-30无效,是因为$currentDate是Mongo的更新操作符,不是聚合管道里的表达式,而且Metabase里的Mongo原生查询需要用聚合支持的日期函数配合系统变量来实现动态日期计算。
下面是修改后的完整查询,用Mongo 5.0+支持的$dateTrunc和$dateAdd来精准计算每日零点的相对日期(确保统计的是完整的自然日数据):
[ { "$lookup": { "from": "institutions", "localField": "institute_id", "foreignField": "_id", "as": "insti" } }, { "$group": { "_id": "$institute_id", "name": { "$first": "$insti.name" }, "applicants1": { "$addToSet": { "$cond": [ { "$gte": [ "$created_at", { "$dateAdd": { "startDate": { "$dateTrunc": { "date": "$$NOW", "unit": "day", "timezone": "UTC" } }, "unit": "day", "amount": -30 } } ] }, "$candidate_id", null ] } }, "applicants2": { "$addToSet": { "$cond": [ { "$gte": [ "$created_at", { "$dateAdd": { "startDate": { "$dateTrunc": { "date": "$$NOW", "unit": "day", "timezone": "UTC" } }, "unit": "day", "amount": -7 } } ] }, "$candidate_id", null ] } }, "applicants3": { "$addToSet": { "$cond": [ { "$gte": [ "$created_at", { "$dateAdd": { "startDate": { "$dateTrunc": { "date": "$$NOW", "unit": "day", "timezone": "UTC" } }, "unit": "day", "amount": -1 } } ] }, "$candidate_id", null ] } } } }, { "$project": { "_id": 0, "name": "$name", "last_30_days": { "$subtract": [{ "$size": "$applicants1" }, 1] }, "last_7_days": { "$subtract": [{ "$size": "$applicants2" }, 1] }, "last_1_day": { "$subtract": [{ "$size": "$applicants3" }, 1] } } }, { "$sort": { "last_30_days": -1 } } ]
关键修改点说明:
- 使用Mongo聚合的**系统变量
$$NOW**获取当前服务器时间 - 用
$dateTrunc把当前时间截断到当日零点,避免时间部分干扰统计(比如今天中午执行时,不会统计今天中午到明天零点的部分) - 用
$dateAdd配合负数天数,计算出近30/7/1天的零点日期,确保统计的是完整的自然日数据
配置每日Pulse邮件步骤:
- 在Metabase中保存上述修改后的原生查询(命名比如“机构申请量日统计”)
- 点击顶部导航的Pulse,创建新Pulse
- 在Pulse中添加你刚保存的查询,设置发送频率为每日,选择你需要的发送时间
- 添加接收邮件的地址,确认配置后保存即可
这样每天Metabase都会自动执行查询,用当日的日期计算近30/7/1天的数据,并发送邮件结果。
内容的提问来源于stack exchange,提问作者Rohit Gaur
相关产品推荐
相关产品推荐

