Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring、MongoDB和upserts:可用于逐个更新,但无法用于批量更新_Java_Spring_Mongodb_Bulkupdate - Fatal编程技术网

Java Spring、MongoDB和upserts:可用于逐个更新,但无法用于批量更新

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:找不到类元素的编解码

在我的测试代码中,我首先使用MongoTemplate.upsert()执行常规的upsert。它会正确地将数据添加到数据库中,并在数据库中显示以下文档,正如预期的那样:

{ "_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;
}