在我的测试代码中,我首先使用 MongoTemplate.upsert() 执行常规 upsert。它正确地将数据添加到数据库中,并且在数据库中出现了以下文档,正如预期的那样:
{ "_id" : 1, "elements" : [ { "payload" : "payload" } ] }
然后我使用 BulkOperations 执行类似的 upsert。它失败,但有以下异常:
org.bson.codecs.configuration.CodecConfigurationException:找不到类元素的编解码器。
我认为这两个调用应该执行相同。我在 BulkOperations API 中遗漏了什么吗?如何像常规操作一样进行批量操作来编码对象?
我使用的是 mongo-java-driver 3.3.0(类似的问题也可以在 2.14.3 上观察到)
public class Main {
public static void main(String[] args) throws UnknownHostException {
MongoTemplate template = new MongoTemplate(new Mongo("localhost"), "local");
// works
template.upsert(makeQuery(1), makeUpdate(), Data.class);
// fails miserably
BulkOperations ops = template.bulkOps(BulkOperations.BulkMode.UNORDERED, Data.class);
ops.upsert(makeQuery(2), makeUpdate());
ops.execute();
}
private static Query makeQuery(int id) {
return Query.query(Criteria.where("id").is(id));
}
private static Update makeUpdate() {
Update update = new Update();
update.set("elements", Collections.singletonList(new Element()));
return update;
}
}
@Document(collection = "test")
class Data {
private int id = 1;
private List<Element> elements;
}
class Element {
private String payload = "payload";
}