MongoDB中每年和每月的聚合
Posted
技术标签:
【中文标题】MongoDB中每年和每月的聚合【英文标题】:Aggregation per year and month in MongoDB 【发布时间】:2021-08-10 15:49:43 【问题描述】:说明:我有一个数组名称作为代码,我有一个查询参数名称为year
(下拉列表2016,2017,2018,2019,....) 和@987654322 @ 下拉列表为 (ALL,01,02,03,04,05,06,07,08,09,10,11,12)。
CASE1:如果用户选择特定年份和特定月份,则相应地获取 code
数组。
CASE2:如果用户选择特定年份和月份ALL,则获取code
数组完整年份。
"code":[
"k": "2016-06-18T18",
"v": 1
,
"k": "2016-06-18T21",
"v": 2
,
"k": "2016-07-19T00",
"v": 13
,
"k": "2015-06-19T03",
"v": 6
,
"k": "2015-07-19T06",
"v": 6
]
CASE 1 预期输出如果用户选择:从年份下拉列表:2016 年,月份:06
"code":[
"k": "2016-06-18T18",
"v": 1
,
"k": "2016-06-18T21",
"v": 2
]
如果用户选择了案例 2 预期输出:从年份下拉列表:2016 年,月份:ALL。
"code":[
"k": "2016-06-18T18",
"v": 1
,
"k": "2016-06-18T21",
"v": 2
,
"k": "2016-07-19T00",
"v": 13
,
]
【问题讨论】:
【参考方案1】: 初始化请求参数var year = req.year;
var month = req.month;
设置默认年份条件
var condition = [
$eq: [ $substr: ["$$this.k", 0, 4] , String(year)]
];
检查月份是否可用,然后添加条件
if (month && month != "all")
condition.push(
$eq: [ $substr: ["$$this.k", 5, 2] , String(month)]
);
$filter
迭代代码循环并过滤以上准备好的条件
db.collection.aggregate([
$set:
code:
$filter:
input: "$code",
cond: $and: condition
])
Playground
【讨论】:
谢谢你的解释真的很棒,但是你能不能一次性查询,我不明白你是怎么设置Ifcondition
的。
CASE 1,工作正常,但 CASE 2 对我来说不能正常工作。
它是按顺序排列的,您可以按顺序排列,对于第二种情况,请验证您的 if 条件,将“all”替换为您在全选时通过的值..并尝试将月份传入像“01”、“02”这样的字符串......
尝试在查询之前和if条件之后控制台condition
字段,并用值显示实际条件..
对不起,我没明白。condition
对我来说不能正常工作,我正在使用 来制作 if condition
。 FREEMARKER你能按照设置吗?或详细说明。谢谢!以上是关于MongoDB中每年和每月的聚合的主要内容,如果未能解决你的问题,请参考以下文章
猫鼬日期比较没有时间和按createdAt和staffId分组,每周、每月和每年按聚合计算的员工总数?