MongoDB聚合中如何使用substring子串对日期字段做比较筛选
MongoDB 聚合按日期子串筛选实现
你可以直接在$filter的判断条件中使用$substrCP字符串截取算子提取TIME字段的年月片段,再和目标子串做相等比对即可,不需要修改其他聚合阶段逻辑。
你的TIME字段存储格式为DD-MM-YYYY HH:mm:ss,要提取MM-YYYY格式的子串,截取起始位置为索引3(字符串索引从0开始计数,前3位为DD-),截取长度为7,刚好得到对应年月片段。
修改后的完整聚合代码如下:
db.customers.aggregate([{ $match: { "CDF.UTILITYTYPE.D1.G1" : "12387835" } }, { $project: { _id:0, "CDF.UTILITYTYPE.D1.G22.NAME":1, "CDF.UTILITYTYPE.D1.G1":1, "CDF.UTILITYTYPE.D5.EVENT": { $filter: { input: "$CDF.UTILITYTYPE.D5.EVENT", as: "item", cond: { $eq: [ // 从索引3开始截取7位,得到MM-YYYY格式子串 { $substrCP: [ "$$item.TIME", 3, 7 ] }, "06-2022" ] } } } } } ]).pretty();
注意事项
- 如果你的TIME字段存在非标准长度的字符串存储,建议先在
$match阶段加字段存在性、格式校验逻辑,避免截取结果不符合预期 - 若存储的日期字符串全为ASCII字符,
$substrCP可以替换为$substrBytes,执行效率没有差异 - 如果后续需要匹配其他年月,直接替换
$eq中第二个参数的目标子串即可,不需要调整截取参数
内容的提问来源于stack exchange,提问作者Aksheet-Goku
相关产品推荐
相关产品推荐

