2

簡単な例の前の短い要約:

  • 私のカスタムコンバーターを使用するという意味で、新しいドキュメントの挿入は問題ありません
  • カスタムコンバーターを使用しないという意味で、既存のドキュメントの更新は問題ありません

私の開発者:

[INFO] +- org.springframework.data:spring-data-mongodb:jar:1.0.0.RC1:compile
[INFO] | +- org.springframework:spring-beans:jar:3.1.0.RELEASE:compile
[INFO] | +- org.springframework:spring-expression:jar:3.1.0.RELEASE:compile
[INFO] | +- org.springframework.data:spring-data-commons-core:jar:1.2.0.RC1:compile
[INFO] | | \- org.springframework:spring-tx:jar:3.1.0.RELEASE:compile
[INFO] | \- org.mongodb:mongo-java-driver:jar:2.7.1:compile

これが独自のコンバーターを持つ私のクラスです

public class MyClass extends MyInterface<String> ..

コンバーターは次のとおりです。

public class MyClassWriteConverter implements Converter<MyClass, DBObject> {
    @Override
    public DBObject convert(MyClass myClass) {
        System.out.println("MyClass WRITE CONVERTER !");
        DBObject dbo = new BasicDBObject();
        dbo.put("title", myClass.getTitle());
        dbo.put("value", myClass.getValue());
        System.out.println("value : " + myClass.getValue());
        System.out.println("class : " + myClass.getClass().getCanonicalName());
        dbo.put("_class", myClass.getClass().getCanonicalName());
        return dbo;
    }
}
public class MyClassElementReadConverter implements Converter<DBObject, MyClass> {
    @Override
    public MyClass convert(DBObject dbObject) {
        String value = (String) dbObject.get("value");
        String title = (String) dbObject.get("title");
        return new MyClass(title, value);
    }
}

<mongo:converter>
    <bean class="kam.albert.MyClassElementReadConverter" />
</mongo:converter>
<mongo:converter>
    <bean class="kam.albert.MyClassElementWriteConverter" />
</mongo:converter>

myDomain には がありList<MyClass<?>> myClasses、カスタム コンバーターが使用されているため、これは正常に機能します。

this.ops.save(myDomain, "myCollection");

デバッグ出力から見ることができるもの:

MyClass ELEMENT WRITE CONVERTER !
value : my value
class : kam.albert.MyClass

そして、私の db.myCollection.find().pretty(); からの結果があります。:

{
    myClasses : [
        {
             "title" : "my title",
             "value" : "my value",
             "_class" : "kam.albert.MyClass"
        }
    ]
}

挿入操作はすべて問題ありません...

しかし、次のように $set を既存のドキュメントに更新すると:

this.ops.updateFirst(
    this.idCriteria(myClass),
    new Update()
        // set the content node
        .set(dotNotation, myClass),
        "myCollection"
);

デバッグ出力は同じままです:

MyClass ELEMENT WRITE CONVERTER !
value : my value
class : kam.albert.MyClass
(edited for clarity, the other properties omitted)
DEBUG [mongodb.core.MongoTemplate]: calling update using query: { "_id" : "81d3292e-fd75-410d-a1f9-b109b6d76194"} and update: { "$
set" : { "myClasses" : [ { "title" : "my title" , "value" : "my value"}]}] } in collection: myCollection

しかし、結果はカスタム コンバーターを使用せず、"_class" 属性を使用しない場合のようになります。

{
    myClasses : [
        {
             "title" : "my title",
             "value" : "my value",
        }
    ]
}

私の現在の結論は次のとおりです。

  • 新しいドキュメントを挿入する場合、カスタム コンバーターは正常に動作します
  • ただし、更新については、カスタムコンバーターが呼び出されているように見えますが(デバッグ出力があります)、実際の更新を行うためにデフォルトの MappingMongoConverter を使用しているようです。

何か足りないのですか?あなたの考えを共有してください..

4

1 に答える 1

2

現在のバージョン (執筆時点で 1.0 GA) は、含まれる潜在的に複雑なオブジェクトを MongoDB がネイティブに処理できるオブジェクトにメッセージを送信する役割を担う にUpdateオブジェクトをパイプ処理しないようです。QueryMapperそのプロセスではMongoConverter、カスタム コンバーターをトリガーする を呼び出す必要があります。

この問題は、提出したチケットに記載されており、次のバグ修正リリース (1.0.1、1.1.M1) で修正される予定です。

于 2012-01-10T08:22:20.357 に答える