2017-04-06 56 views
0

我正在尋找正確的方法來實現upsert操作使用Spring Data提供的API的Mongo Collection。Spring Data Mongo:upsert各個領域更新

具體來說,我有以下用例。收集collection的架構是類似如下:在第一插入期間,所述第二與後續:

{ 
    _id: "some_id", 
    field1: "value1", 
    field2: "value2", 
    subdocument1: { 
    // A subdocument with some fields 
    }, 
    subdocument2: { 
    // A subdocument with some other fields 
    } 
} 

字段field1field2總是存在的,但subdocument1subdocument2將在不同的時刻被插入更新。

我看到MongoTemplate有和upsert方法。使用這種方法,我必須建立我自己的更新操作。

Query query = Query.query(Criteria.where("_id").is("some_id")); 
Update.update("_id", "some_id") 
     .set("field1", "value1") 
     .set("field2", "value2) 
     .set("subdocument1", subdocumentObject); 
mongoTemplate.upsert(query, update, Collection.class); 

我不明白,如果這是我正在尋找的,是否有更好的方法。

感謝。

回答

1

我相信你在找什麼是$setOnInsertsubdocument1。所以像這樣的東西應該適合你。

Query query = Query.query(Criteria.where("_id").is("some_id")); 
Update update = Update.update("_id", "some_id") 
       .set("field1", "value1") 
       .set("field2", "value2") 
       .set("subdocument2", subdocumentObject2) 
       .setOnInsert("subdocument1", subdocumentObject1); 

這裏更多https://docs.mongodb.com/manual/reference/operator/update/setOnInsert/

+0

感謝'setOnInsert'方法,我很懷念它。我將用它作爲'field1','field2'。不幸的是,我不知道如果'subdocument1'或'subdocument2'會先到達。 –

+0

您不必爲'field1'和'field2'使用'setOnInsert',因爲它們總是存在。你應該繼續對這些字段使用'set'。你可以寫一個條件語句,如'if(「somecriteria」)update.set(「subdocument2」...) } else update.setOnInsert(「subdocument1」...)' – Veeram

+0

我不明白爲什麼你正在爲'subdocument1'和'subdocument2'提出一種不同的方法。你能辯論這個事實嗎? –