如何将MongoDB当日数据查询转换为适配NiFi GetMongo的JSON格式?
解决NiFi GetMongo处理器当日文档查询的JSON格式问题
问题根源
Mongo Compass支持直接使用JavaScript表达式(如new Date())构建查询,但NiFi的GetMongo处理器要求Query属性必须是严格合法的JSON格式——JSON不允许包含函数调用或非标准语法,这就是原语句报错的核心原因。
适配的查询方案
以下是两种可行的解决方案,优先推荐方案1(动态生成日期,无需硬编码):
方案1:用NiFi表达式语言动态生成当日时间范围
利用NiFi的表达式语言(EL)计算当日0点和23:59:59.999的ISO标准日期字符串,嵌入到JSON查询中。直接将以下内容填入GetMongo的Query属性:
{"time_created": {"$gte": "${now():setHour(0):setMinute(0):setSecond(0):setMillisecond(0):format('yyyy-MM-dd\'T\'HH:mm:ss.SSS\'Z\'')}", "$lt": "${now():setHour(23):setMinute(59):setSecond(59):setMillisecond(999):format('yyyy-MM-dd\'T\'HH:mm:ss.SSS\'Z\'')}"}}
- 说明:NiFi会自动解析
${...}中的表达式,动态计算当日的起始和结束时间,生成符合MongoDB要求的ISO日期字符串。 - 注意:表达式中的单引号需要用
\'转义,避免与JSON的双引号冲突。
方案2:使用MongoDB扩展JSON格式($date关键字)
如果需要显式指定日期类型,可使用MongoDB的扩展JSON语法,同样结合NiFi表达式动态生成:
{"time_created": {"$gte": {"$date": "${now():setHour(0):setMinute(0):setSecond(0):setMillisecond(0):format('yyyy-MM-dd\'T\'HH:mm:ss.SSS\'Z\'')}"}, "$lt": {"$date": "${now():setHour(23):setMinute(59):setSecond(59):setMillisecond(999):format('yyyy-MM-dd\'T\'HH:mm:ss.SSS\'Z\'')}"}}}
- 说明:
$date关键字会告诉MongoDB将后面的字符串解析为Date类型,适用于对日期类型有严格要求的场景。
方案3:临时硬编码日期(仅用于测试)
如果只是临时测试,可直接写入当日的ISO日期字符串(注意替换为实际日期):
{"time_created": {"$gte": "2024-05-20T00:00:00.000Z", "$lt": "2024-05-20T23:59:59.999Z"}}
- 缺点:日期是固定的,无法自动更新,不适合生产环境。
验证方法
配置完成后,可通过NiFi的处理器验证功能(右键处理器→View Configuration→验证Query属性)检查格式是否合法,或运行处理器查看是否能正确获取当日文档。
内容的提问来源于stack exchange,提问作者Manh Quang Do
相关产品推荐
相关产品推荐

