Java Spring、MongoDB和upserts:可用于逐个更新,但无法用于批量更新
在我的测试代码中,我首先使用MongoTemplate.upsert()执行常规的upsert。它会正确地将数据添加到数据库中,并在数据库中显示以下文档,正如预期的那样:Java Spring、MongoDB和upserts:可用于逐个更新,但无法用于批量更新,java,spring,mongodb,bulkupdate,Java,Spring,Mongodb,Bulkupdate,在我的测试代码中,我首先使用MongoTemplate.upsert()执行常规的upsert。它会正确地将数据添加到数据库中,并在数据库中显示以下文档,正如预期的那样: { "_id" : 1, "elements" : [ { "payload" : "payload" } ] } 然后,我使用bulk操作执行类似的upsert。它失败,但出现以下异常: org.bson.codecs.configuration.CodecConfigurationException:找不到类元素的编解码
{ "_id" : 1, "elements" : [ { "payload" : "payload" } ] }
然后,我使用bulk操作执行类似的upsert。它失败,但出现以下异常:
org.bson.codecs.configuration.CodecConfigurationException:找不到类元素的编解码器
我认为这两个调用应该执行相同的操作。我在操作API中遗漏了什么吗?如何像常规操作一样进行批量操作来编码对象
我使用mongo java驱动程序3.3.0(在2.14.3上也可以观察到类似的问题)
公共类主{
公共静态void main(字符串[]args)引发UnknownHostException{
MongoTemplate=新MongoTemplate(新Mongo(“本地主机”),“本地”);
//工作
upsert(makeQuery(1),makeUpdate(),Data.class);
//惨败
BulkOperations ops=template.bulkOps(BulkOperations.BulkMode.UNORDERED,Data.class);
upsert(makeQuery(2),makeUpdate());
ops.execute();
}
私有静态查询makeQuery(int-id){
return Query.Query(Criteria.where(“id”).is(id));
}
私有静态更新makeUpdate(){
更新=新更新();
update.set(“elements”,Collections.singletonList(新元素());
返回更新;
}
}
@文档(collection=“test”)
类数据{
私有int id=1;
私有列表元素;
}
类元素{
专用字符串payload=“payload”;
}
批量更新列表
字段时,spring data mongo中似乎存在错误,列表
中的项不是标量(如字符串
,整数
)。它抱怨没有代码
有一种方法可以避免它
private static Update makeUpdate() {
Update update = new Update();
update.set("elements", mongoConverter.convertToMongoType(Collections.singletonList(new Element())));
return update;
}
其中,mongoConverter
是一个org.springframework.data.mongodb.core.convert.mongoConverter
,您可以在bean中自动连接一个实例
private static Update makeUpdate() {
Update update = new Update();
update.set("elements", mongoConverter.convertToMongoType(Collections.singletonList(new Element())));
return update;
}