Java Vertx调用bulkWrite时,Upsert为True含$set的UpdateOne抛异常
解决Vertx中bulkWrite调用updateOne时的"Invalid BSON field name $set"异常
问题原因
出现这个异常的核心原因是手动构造的JSON结构未被Vertx Mongo客户端正确识别为Mongo更新操作,或是使用了错误的API方式构建bulk更新指令,导致$set被当作普通文档字段名而非Mongo更新操作符。
解决方案
方案1:使用Vertx Mongo客户端的JsonObject正确构造bulk操作
通过Vertx的JsonObject直接构建完整的updateOne指令,确保update部分的嵌套结构正确,避免手动拼接JSON字符串带来的解析问题:
import io.vertx.core.json.JsonObject; import io.vertx.ext.mongo.MongoClient; import java.util.Collections; // 初始化MongoClient(假设已完成配置) MongoClient mongoClient = MongoClient.createShared(vertx, new JsonObject().put("db_name", "your_db")); // 构造过滤条件 JsonObject filter = new JsonObject().put("_id", "0"); // 构造$set更新操作 JsonObject update = new JsonObject().put("$set", new JsonObject().put("errorCodeCount", 1)); // 构造updateOne类型的bulk指令 JsonObject updateOneOp = new JsonObject() .put("updateOne", new JsonObject() .put("filter", filter) .put("update", update) .put("upsert", true)); // 执行bulkWrite mongoClient.bulkWrite("your_collection", Collections.singletonList(updateOneOp), result -> { if (result.succeeded()) { System.out.println("批量更新完成"); } else { result.cause().printStackTrace(); } });
方案2:结合原生Mongo驱动API构建Bulk操作
如果Vertx整合了原生Mongo驱动,推荐使用原生驱动的UpdateOneModel构建操作,这种方式更可靠,能彻底避免BSON解析问题:
import com.mongodb.client.MongoCollection; import com.mongodb.client.model.UpdateOneModel; import com.mongodb.client.model.Filters; import com.mongodb.client.model.Updates; import com.mongodb.client.model.UpdateOptions; import com.mongodb.client.model.BulkWriteOptions; import org.bson.Document; import java.util.Collections; // 获取MongoCollection(假设已完成客户端初始化) MongoCollection<Document> collection = mongoClient.getCollection("your_collection"); // 构建updateOne操作模型 UpdateOneModel<Document> updateOneModel = new UpdateOneModel<>( Filters.eq("_id", "0"), // 过滤条件 Updates.set("errorCodeCount", 1), // $set更新操作 new UpdateOptions().upsert(true) // 启用upsert ); // 执行bulkWrite collection.bulkWrite(Collections.singletonList(updateOneModel), new BulkWriteOptions(), (result, err) -> { if (err == null) { System.out.println("修改文档数:" + result.getModifiedCount()); } else { err.printStackTrace(); } });
额外检查项
- 确认Vertx Mongo客户端版本:旧版本可能存在BSON操作符解析bug,建议升级到最新稳定版。
- 避免手动拼接JSON字符串转JsonObject:手动拼接易出现格式错误,直接用
JsonObject的put方法构建更可靠。
内容的提问来源于stack exchange,提问作者susheel chaudhary
相关产品推荐
相关产品推荐

