使用Apache Camel从MongoDB删除文档的实现及官方文档约定疑问
Apache Camel MongoDB组件相关问题解答
官方文档对应内容说明
官方文档中注释状态的Camel路由是删除操作的可运行参考示例,未注释的两个Java对象为删除操作的查询条件封装类:Camel MongoDB组件执行删除类操作时,默认将当前消息体作为过滤查询条件,这两个类就是用来标准化承载你要匹配的删除规则的,无需放在特殊路径,和你项目里的普通业务POJO类放在同一包(通常是entity、pojo、model目录)即可,如果你直接用MongoDB官方的Document、Bson类构造查询条件,也可以不用自定义这两个类。
业务场景代码改造方案
你需要的先删除匹配条件文档、再存入新消息的逻辑,可直接在现有save操作前新增删除步骤即可,参考实现如下:
from("jms:topic:orderbook.raw.feed") // 先存储原始消息体,避免删除操作覆盖后找不到要保存的内容 .setProperty("originalPayload", body()) .log("JMS Message: ${body}") .choice() .when().jsonpath("$.[?(@.type=='partial')]") // 构造删除过滤条件:type=T1 .setBody(constant(Document.parse("{\"type\": \"T1\"}"))) // 执行删除操作,匹配到的所有文档都会被删除 .to("mongodb:mongo?database=k2_dev&collection=orderbooks&operation=remove") // 恢复原始消息体用于保存 .setBody(exchangeProperty("originalPayload")) .to("mongodb:mongo?database=k2_dev&collection=orderbooks&operation=save");
优化建议与注意事项
- 如果你的删除条件需要从原始消息中动态取值,比如要删除和新消息同业务id的历史数据,直接从
originalPayload属性中取值构造查询条件即可 - 若匹配条件是唯一索引字段,推荐用upsert更新操作代替先删后存的逻辑,原子性更好、性能更高,只需将操作改为
operation=update并新增upsert=true参数即可 - 如果只需要删除单条匹配文档,可以把操作参数改为
operation=removeOne - 删除操作执行后消息体默认会被替换为删除的文档数量,必须恢复原始消息体后再执行保存操作,否则会把数字写入MongoDB
内容的提问来源于stack exchange,提问作者BenW
相关产品推荐
相关产品推荐

