3

在我的测试代码中,我首先使用 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";
}
4

1 回答 1

1

List批量更新字段时,spring-data-mongo 中似乎存在错误,并且其中的项目List不是标量(如String, Integer)。它抱怨没有codes

有一种方法可以避免它

private static Update makeUpdate() {
    Update update = new Update();
    update.set("elements", mongoConverter.convertToMongoType(Collections.singletonList(new Element())));
    return update;
}

mongoConvertera在哪里org.springframework.data.mongodb.core.convert.mongoConverter,你可以在你的 bean 中自动装配一个实例。

于 2017-04-26T08:47:08.923 回答