2017-04-24 8 views
0

springのmongoTemplateを使用するか、そうでなければ既存のmongoドキュメントを単純にマージする方法はありますか?Spring MongoTemplate Update Merge

私がマージと言うとき、私は、次の現象が発生します:

  1. 修飾子文書内のフィールドは、文書のバックエンドのバージョンに存在する場合、修正に新しい値で更新。
  2. 修飾子ドキュメントのフィールドがバックエンドバージョンに存在しない場合は、フィールドを追加します。
  3. バックエンド文書の他のフィールドはすべてそのままにしてください。
+0

あなたは明確なロジックを持っており、それをurselfで実装しています;) – Jaiwo99

答えて

0

upsertを実行しますか? これは正常に動作する必要があります。id「ABC」を持つユーザーのための

//suppose that you are trying to get user with Id=abs 
    Query query = new Query(); 
    query.addCriteria(where(ID).is("abc")); 

    //and then you can add or update the new field (if the field does not exist, the template adds it into the document) 
    Update update = new Update(); 
    update.set("addThisField", new Date()); 

    mongo.upsert(query, update, User.class); 

基本的には、このクエリ検索。ユーザーがフィールドaddThisFieldを持っている場合、更新を実行します。ユーザーがそのフィールドを持っていない場合は、そのフィールドをドキュメントに追加します。

this.mongoTemplate.update**(<your_criteria>, 
Update.fromDBObject(BasicDBObjectBuilder.start("$set", 
<your_object>).get()), <output>.class) 

サンプル:

BasicDBObject dbObject = new BasicDBObject("a", 1); 
Query query = Query.query(Criteria.where("_id").is("123"); 
Update update = Update.fromDBObject(BasicDBObjectBuilder.start("$set", 
dbObject).get()); 

this.mongoTemplate.updateFirst(query, update, BasicDBObject.class, 
"my_collection"); 

をあなたは基本的に使用している私はあなたがMongoTemplateを使用してマージを実行したい場合は、次の操作を行うことができ、スプリングブーツ1.4

1

でそれをテストしている

渡すオブジェクト内のすべての既存の値を更新するように設定されています。私はそれを行うための最もエレガントな方法がうまく動作するかどうかはわかりません。

更新基準を作成するために文書が既に存在していることを前提としているので、ここでupsertのケースをカバーしていません。

関連する問題