21

以下は単純な pojo です。

public class Description {
    private String code;
    private String name;
    private String norwegian;
    private String english;
}

upsertまた、 Spring MongoTemplate を介して MongoDbに適用するには、次のコードを参照してください。

Query query = new Query(Criteria.where("code").is(description.getCode()));
Update update = new Update().set("name", description.getName()).set("norwegian", description.getNorwegian()).set("english", description.getEnglish());
mongoTemplate.upsert(query, update, "descriptions");

Updateオブジェクトを生成する行は、Itemクラスのすべてのフィールドを手動で指定します。

しかし、Itemオブジェクトが変更されると、Dao レイヤーが壊れます。

私のItemクラスのすべてのフィールドが自動的に更新に適用されるように、これを回避する方法はありますか?

例えば

Update update = new Update().fromObject(item);

私の pojo は拡張しないことに注意してくださいDBObject

4

12 に答える 12

21

この質問に対するかなり良い解決策を見つけました

//make a new description here
Description d = new Description();
d.setCode("no");
d.setName("norwegian");
d.setNorwegian("norwegian");
d.setEnglish("english");

//build query
Query query = new Query(Criteria.where("code").is(description.getCode()));

//build update
DBObject dbDoc = new BasicDBObject();
mongoTemplate.getConverter().write(d, dbDoc); //it is the one spring use for convertions.
Update update = Update.fromDBObject(dbDoc);

//run it!
mongoTemplate.upsert(query, update, "descriptions");

Update.fromDBObject は、dbDoc のすべてのフィールドを含む更新オブジェクトを返すことに注意してください。null 以外のフィールドを更新するだけの場合は、null フィールドを除外する新しいメソッドをコーディングする必要があります。

たとえば、フロントエンドは次のようなドキュメントを投稿します。

//make a new description here
Description d = new Description();
d.setCode("no");
d.setEnglish("norwegian");

「language」フィールドを更新するだけです。

//return Update object
public static Update fromDBObjectExcludeNullFields(DBObject object) {
    Update update = new Update();       
    for (String key : object.keySet()) {
        Object value = object.get(key);
        if(value!=null){
            update.set(key, value);
        }
    }
    return update;
}

//build udpate
Update update = fromDBObjectExcludeNullFields(dbDoc);
于 2016-01-22T09:27:18.600 に答える
6

save を使用できます:(存在しない場合=挿入else = upsert)

save(Object objectToSave, String collectionName)

読み取り: javadoc

于 2014-10-07T08:34:01.747 に答える
0

使用するだけReflectionDBObjectです-Description拡張する場合は、オブジェクトのフィールドをUpdate反射的に、自動的に転送する必要があります。更新に含まれる null フィールドに関する上記の注意事項は、依然として当てはまります。

于 2016-06-07T01:10:18.213 に答える