2016-08-17 5 views
1

mongoTemplate.save()を使用してドキュメントを永続化すると、データベースドキュメント内のマッピングされていないすべてのフィールドが破棄されます。スプリングデータmongoTemplate.save()の動作

たとえば、あなたはMongoDBの中の文書のコレクション "マイドキュメント" があります。

{ 
    "_id": ObjectId("552402c3186eb112488b45ea"), 
    "field1": "value1", 
    "field2": "value2" 
} 

をし、あなたのドメインオブジェクトは、次のようになります。ドキュメントを更新

public class MyDocument { 
    @Id 
    private String id; 
    private String field1; 

    // getter and setter 
} 

MyDocument doc = myDocumentRepository.getById(<some_id>); 
doc.setField1("value3"); 
mongoTemplate.save(doc); 

「フィールド2」のないコレクションで:

{ 
    "_id": ObjectId("552402c3186eb112488b45ea"), 
    "field1": "value3" 
} 

それは予期しない動作のように見えるし、いくつかの異なるアプリケーションが同じデータベースを使用している本当のストッパーかもしれません。

MongoTemplateメソッドをオーバーライドするのは問題ありませんか? 他のアイデアは非常に高く評価されます。

ありがとうございました。

更新

@helmyによって示されるように、これはmongoTemplate.save()が動作し、更新メソッドの使用が好ましい方法です。しかし、この場合、mongodbマッピングフレームワークに組み込まれたライフサイクルイベントが失われています。それは全体文書を上書きします - 例えば、全く予期しない、または驚くことではありません、検証、それはOnBeforeSaveメソッドイベントにリスナーを契機に、更新上で動作しません...

+0

"...異なるアプリケーションがほとんど同じデータベースを使用していない場合。" - 基本的な建築上の問題だと私は主張したい。 –

+0

@OliverGierkeはい、それは一般的な状況です。悲しいことに、それは完璧な世界ではありません:) – Savash

答えて

2

は、それがどのようsave()作品です。

私はあなたのアップデートを実行するために、Spring Updateクラスを見てみることをお勧めします。

+1

他のフレームワークはそのような振る舞いをしていないので、少なくとも私にとっては予期しないことです。例えば、Doctrineはマッピングされていないフィールドをオーバーライドしません。フィールドがマップされていないと、それを管理したくないという手がかりが与えられます。 ドキュメントの更新は、ドキュメントのライフサイクルでSpring開発者に含まれていないため、ライフサイクルイベントを発行しません。それは多くの不便をもたらす。あなたは何かを提案することはできますか?... – Savash

+0

それは私にとっても非常に意外です。私はRubyから来ているし、MongoIDはRubyの下でマッピングされていないフィールドを消去しない。私は共通点を意味する!真剣に?それはまったくばかげた行動です!そして、このMongoTemplateは何ですか?なぜ私はそれが必要ですか? Rubyの人生ははるかに簡単ですが、今私はこの間抜けに対処しなければなりません:-(私は助けていただければ幸いです。 –

関連する問題