MongoDB聚合查询如何同时实现$match过滤、$merge写入及新增字段?
问题解答
一、查询无数据写入的原因
- 数据类型不匹配:你在
$match阶段给created_datetime字段的筛选值是字符串类型的"2021-08-18 12:00:00",但jobs集合中存储的created_datetime是ISODate日期类型,MongoDB不会自动对跨类型的字段值做比较,因此这条筛选条件会匹配不到任何文档。 - 时间范围不匹配:你给出的jobs集合示例文档的
created_datetime为2021-07-23T15:10:18.506Z,早于你筛选的2021-08-18 12:00:00,即使调整了数据类型,该示例文档也不会被命中。
二、单条聚合查询新增字段的实现方案
你可以在$match和$merge阶段之间插入$addFields(或等价的$set)聚合阶段,直接为待写入的文档新增report_name字段,不需要额外调用updateMany,参考实现代码如下:
db.getCollection("jobs").aggregate([ // 匹配阶段:注意把日期字符串转为ISODate类型 { $match: { "job_name": "UploadFile", "created_datetime" : {"$gte": ISODate("2021-08-18T12:00:00Z") } } }, // 新增字段阶段:按需设置report_name的值,支持固定值、现有字段拼接、动态生成等写法 { $addFields: { // 示例1:固定前缀+当前时间戳 "report_name": "上传任务报表_" + ISODate().toISOString() // 示例2:用现有文档字段拼接:"report_name": {$concat: ["报表_", "$job_id"]} } }, // 写入阶段:如果reports集合不存在会自动创建 { $merge: { into: "reports", // 可选配置:_id重复时的处理逻辑,默认是merge,可按需改为replace/keepExisting/fail等 whenMatched: "replace" } } ])
如果需要每隔2小时定时执行该逻辑,自建MongoDB可配合crontab、业务层定时任务调度实现,MongoDB Atlas环境可直接使用Triggers定时触发。
内容的提问来源于stack exchange,提问作者SrTan
相关产品推荐
相关产品推荐

