3

私のテスト コードでは、最初に MongoTemplate.upsert() を使用して通常のアップサートを実行します。DB にデータが正しく追加され、期待どおり、次のドキュメントが db に表示されます。

{ "_id" : 1, "elements" : [ { "payload" : "payload" } ] }

次に、BulkOperations を使用して同様の upsert を実行します。次の例外で失敗します。

org.bson.codecs.configuration.CodecConfigurationException: クラス Element のコーデックが見つかりません。

これら 2 つの呼び出しは同じように実行されるはずだと思いました。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

フィールドを一括更新するときに spring-data-mongo にバグがあるようでList、 の項目はListスカラー ( String、 などInteger) ではありません。がないと文句を言いcodesます。

それを回避する方法が1つあります

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 でインスタンスを自動配線できます。

于 2017-04-26T08:47:08.923 に答える