在Camel中使用动态选择器查询MongoDB是否有更简化的参数传递方式?
Apache Camel MongoDB动态查询简化方案
Apache Camel的MongoDB组件原生支持两种更简便的传参方式,不需要编写完整的匿名Expression实现类,也可以直接传入Mongo原生的JSON查询语法:
方案1:Lambda简化实现(Java 8+适用)
直接用Lambda表达式替换原有的匿名Expression类,代码量大幅缩减:
.setHeader(MongoDbConstants.CRITERIA, exchange -> Filters.eq("id", exchange.getIn().getHeader("orderid", Long.class)) ) .log("${headers.CamelMongoDbCriteria}") .to("mongodb:mongo?database={{spring.data.mongodb.database}}&collection=ftx_orders&operation=findOneByQuery")
Camel内部会自动处理类型转换,不需要手动调用TypeConverter的转换逻辑。
方案2:直接传入Mongo原生JSON查询语法
如果不想调用Mongo的Filters API,可以直接把符合Mongo查询语法的JSON字符串传入CamelMongoDbCriteria头,组件内置的类型转换器会自动把JSON转为可执行的Bson查询对象:
// 完全贴合Mongo原生find({})的写法,支持所有Mongo原生查询操作符 .setHeader(MongoDbConstants.CRITERIA, simple("{ \"id\": ${header.orderid}, \"createTime\": { $gte: ISODate('2024-01-01') } }")) .log("${headers.CamelMongoDbCriteria}") .to("mongodb:mongo?database={{spring.data.mongodb.database}}&collection=ftx_orders&operation=findOneByQuery")
注意事项
- 如果查询参数包含特殊字符,建议先通过Fastjson、Gson等序列化工具将Map或者Bson对象转为JSON字符串再设置到头中,避免JSON语法错误
- 日期、ObjectId等特殊类型可以直接用Mongo原生的函数写法,不需要额外转换
内容的提问来源于stack exchange,提问作者BenW
相关产品推荐
相关产品推荐

