首页 > 解决方案 > Mongodb $set 和 $inc 在骆驼

问题描述

我正在尝试使用 $set 和 $inc 标志来更新字段并将camel(java)中的字段增加1。这是我正在使用的代码:

from("direct:mySampleRoute").routeId("update-mongo-db-entry").setBody()
    .simple("{\"person\": \"${headers.personName}\", \"job\": \"computerGuy\",\"title\": \"DR\"},"
    + "{\"$set\": {\"pay\": \"${headers.newPay}\"}, \"$inc\": {\"hrPay\": 1}}")
    .toD("mongodb:mongoClient?database=" + mongoDb + "&collection="
            + mongoEmplyeeCollection + "&operation=update")
    .end();

查询的目标是找到 person == ${headers.personName}、job == computerGuy 和 title = DR 的条目。找到后,将 pay 字段设置为 ${headers.newPay} 并将 hrPay 字段设置为正 1。据我所知,我的代码结构与这篇文章中提到的完全相同:What am我在更新中使用 $set 和 $inc 做错了但是,一旦执行,我的应用程序就会崩溃,并且我无法看到任何关于该查询失败原因的日志。因此,我怀疑我在构建 json 更新时遇到了根本问题。位于此处的骆驼文档的帮助有限。

使用骆驼,我怎样才能实现进行“选择”查询、使用 $set 更新某些字段以及使用 $inc 递增字段的目标?

标签: mongodbapache-camel

解决方案


我最终使用处理器来创建所需的主体来解决我的问题。我在 process 方法中使用了这个语法:

@Override
public void process(final Exchange exchange) throws Exception {
    final BasicDBObject filterQuery = new BasicDBObject();
    filterQuery.append("person", exchange.getIn().getHeader("personName"));
    filterQuery.append("job", "computerGuy");
    filterQuery.append("title", "DR");
    final BasicDBObject updateQuery = new BasicDBObject();
    updateQuery.append("$set", new BasicDBObject("pay", exchange.getIn().getHeader("newPay"))
            .append("location", "4th floor"));
    updateQuery.append("$inc", new BasicDBObject("hrPay", 1));
    final List<DBObject> query = new ArrayList<>();
    query.add(filterQuery);
    query.add(updateQuery);
    exchange.getIn().setBody(query);
}

推荐阅读