2017-06-18 3 views
0

私はSparkJavaプロジェクトでMongoDBとMorphiaを使用しています。これは今私にとって新しい冒険です。私はこれがデータベースの既存のオブジェクトを更新する最良の方法であるかどうか疑問に思っていますか?完全な文書を更新する場合は、より良い方法がありますか?私ContentBlockDaoでMorphiaでmongodbオブジェクトを更新する際のベストプラクティスです

例の更新方法は、

@Override 
public ContentBlock update(ContentBlock contentBlock) throws DaoException { 
    Query<ContentBlock> query = datastore.createQuery(ContentBlock.class) 
      .field("id").equal(new ObjectId(contentBlock.getId())); 
    UpdateOperations<ContentBlock> updateOperations = setValuesForUpdate(
                 datastore.createUpdateOperations(ContentBlock.class), 
                 contentBlock); 

    datastore.update(query, updateOperations); 

    return query.get(); 
} 

private UpdateOperations setValuesForUpdate(UpdateOperations<ContentBlock> updateOperations, 
              ContentBlock contentBlock) { 

    updateOperations.set("html", contentBlock.getHtml()); 
    updateOperations.set("lastUpdater", contentBlock.getLastUpdater()); 

    return updateOperations; 
} 

答えて

2

ましょうmorphiaはあなたのためのオブジェクトの更新を管理します。

ドキュメントを完全に置き換えるには、saveメソッドを使用します。エンティティelse置換文書に_idが存在しない場合は、新しい文書を作成します。

<T> Key<T> save(T entity); 

選択フィールドの更新にマージメソッドを使用します。これはdbobjectを入力エンティティと比較し、変更されたフィールドを更新します。

<T> Key<T> merge(T entity) 

他のクエリ基準については、updateメソッドを使用できます。

<T> UpdateResults update(T entity, UpdateOperations<T> var2); 
+0

私は保存しようとしましたが、何らかの理由で同じ_idのドキュメントに重複している同じオブジェクトが見えてしまいます。なぜこれが起こっているのか分かりません。 json文字列を送信し、ContentBlockオブジェクトに変換して保存します。 – mattwallace

+0

'_id'フィールドがMongoDBで一意な制約を持っているので、' _id'は 'id'ではありませんか? 'ContentBlock'クラスの' @ Id'アノテーションでidフィールドにアノテーションを付けてみてください。問題が解決しない場合は、サンプルのJSON文字列と変換コードと共に 'ContentBlock'オブジェクトを追加できます。 – Veeram

関連する問題