2016-12-15 9 views
0

mongodbが新しく、ドキュメントの更新方法を理解するのに苦労しています。私はそれがドキュメントを更新しません。このように、この文書を検索し、更新しようとするとSpring Mongodb findandModifyがドキュメント全体の更新に失敗する

@Document(collection = "menu") 
public class Menu { 
@Id 
private String id; 
private String someid; 
private String someProperty; 
private List<SomeClass> list; 

// accessors 
} 

{ 
"someId":"id123", 
"someProperty":"property123", 
"list" : [{ 
    "innerProperty":"property423" 
}] 
} 

私のエンティティにマップ: 私は「メニュー」と呼ばれる文書を持っています。それは確かにそれはIDを持つ元のエンティティを返すようようなメニューを見つけるん:

@Override 
public Menu update(Menu menu) { 
    Query query = new Query(
      Criteria.where("someId").is(menu.getSomeId())); 
    Update update = Update.update("menu", menu); 
    return mongoOperations.findAndModify(query, update, 
      FindAndModifyOptions.options().returnNew(true), Menu.class); 
} 

をしかし、私はこれにそれを変更した場合、それが動作します:

@Override 
public Menu update(Menu menu) { 
    Query query = new Query(
      Criteria.where("someId").is(menu.getSomeId())); 
    Update update = new Update().set("someProperty", menu.getSomeProperty()) 
    .set("list", menu.getList()); 
    return mongoOperations.findAndModify(query, update, 
      FindAndModifyOptions.options().returnNew(true), Menu.class); 
} 

私は本当にこの第二の方法好きではありませんドキュメントの各要素は個別に設定されていますが、ドキュメントがかなり大きく、エラーが発生する可能性があります。

なぜ最初の方法は機能しませんか?そして、文書を更新するためのよりよいアプローチは何でしょうか?

答えて

0
Update update = Update.update("menu", menu) 

内部

new Update().set("menu", menu) 

を呼び出し、更新に失敗したメニューとしてそのようなプロパティが存在しないため、提供されたキーを使用してアップデートを作成するだけでstaticファクトリメソッドです。

+0

その場合、個別のプロパティを設定するのではなく、ドキュメント全体をどのように更新できますか? – Rohit

+0

私は春がそれを行うラッパーを提供しているとは思わない。別のmongoマッピングドライバであるMorphiaが、$ eachを使ってすべてのプロパティをbeanの値でラップし、すべてのプロパティキーと値をupdateの配列として送信することを知っています。 – Veeram

+0

pushまたはaddToSetを試すことができるかどうかを確認してください。それはうまくいくかもしれないが、私は疑う。 Update update = Update.push( "menu"、menu); – Veeram

関連する問題