如何使用Apache Camel实现单次请求查询Mongo两个集合后合并插入数据
Apache Camel MongoDB 多集合关联插入实现方案
你需要在原有单集合插入路由的基础上,增加「原始参数暂存、collection2查询、数据合并」三个环节即可实现需求,完整实现代码如下:
rest().post("/createcollection1") .route() .log("原始请求参数: ${body}") // 暂存原始请求参数,避免后续Mongo查询操作覆盖body导致数据丢失 .setProperty("originalPayload", body()) // 构造collection2查询条件,示例默认用item字段关联两个集合,可根据实际业务调整 .setBody().simple("{ \"item\": \"${body.item}\" }") // 查询collection2的匹配单条数据 .to("mongodb:myMongo?database=practice&collection=collection2&operation=findOne") // 合并collection2的qty字段和原始请求参数 .process(exchange -> { // 取出暂存的collection1插入参数 Map originalBody = exchange.getProperty("originalPayload", Map.class); // 取出collection2的查询结果 org.bson.Document collection2Doc = exchange.getIn().getBody(org.bson.Document.class); // 合并qty字段 originalBody.put("qty", collection2Doc.getInteger("qty")); // 把合并后的完整数据设置为新的body exchange.getIn().setBody(originalBody); }) // 插入合并后的完整文档到collection1 .to("mongodb:myMongo?database=practice&collection=collection1&operation=insert") // 可选:返回插入结果给调用方 .setBody().simple("插入成功,文档ID:${headers.CamelMongoOid}");
关键逻辑说明
- 关联规则调整:如果两个集合的关联字段不是item,只需修改
setBody步骤中的查询语句即可,比如按id关联就改为{ \"_id\": \"${body.id}\" } - 异常兼容:可在process逻辑中增加空值校验,比如collection2无匹配数据时为qty设置默认值,避免空指针异常
- 类型适配:如果接口入参是自定义实体类而非Map,只需将process中
originalBody的接收类型替换为对应的实体类即可 - 插入结果获取:Camel MongoDB组件会自动把生成的文档ID存入
CamelMongoOid请求头,可直接取出使用
内容的提问来源于stack exchange,提问作者kumaranc
相关产品推荐
相关产品推荐

