2017-08-31 49 views
0

我有一個這樣的文件在我的數據庫:MongoDB中如何查詢和這樣的地圖<字符串,地圖<字符串,對象>>更新數據

{ "MyDiaries":[{  
      id:"diary1", 
      "MyCalendar1" : { 
       "Date1" : { 
        "holidaytype" : "CHRISTMAS", 
        "optional" : false 
       } 
      }, 
      "MyCalendar2" : { 
       "Date1" : { 
        "holidaytype" : "CHRISTMAS", 
        "optional" : false 
       }, 
       "Date2" : { 
        "holidaytype" : "NEWYEAR", 
        "optional" : true 
       } 
      } 
     }, 
     { 
      id:"diary2", 
      "MyCalendar1" : { 
       "Date1" : { 
        "holidaytype" : "CHRISTMAS", 
        "optional" : false 
       } 
      }, 
      "MyCalendar2" : { 
       "Date1" : { 
        "holidaytype" : "CHRISTMAS", 
        "optional" : false 
       }, 
       "Date2" : { 
        "holidaytype" : "NEWYEAR", 
        "optional" : true 
       } 
      } 
     } 
    ] 
    } 

,並在Java的Map<MyCalendarString, Map<DateString, Object>>。在插入數據時,我必須檢查是否存在特定的日記,日曆是否存在以及日期是否相同。

  1. 如果是這樣,那麼我們必須重寫。
  2. 如果沒有,那麼我們必須插入日期,如果它不在日曆中。
  3. 如果日曆本身不存在,那麼我們必須創建一個新的日曆。

請讓我知道我該怎麼做。

我有這個了,但它沒有工作:

Query query = new Query(); 
Criteria criteria = getContextCriteria().and(CALENDAR).is(model.getRateCalendar()) 
     .and(DATE).is(model.getDate()); 
query.addCriteria(criteria); 
    update.(CALENDAR, getMyCalendars());//getMyCalendars() will give Map<String, Map<String, Object>> 

FindAndModifyOptions findAndModifyOptions = FindAndModifyOptions.options().upsert(true).returnNew(true); 
return mongoTemplate.findAndModify(query, update, findAndModifyOptions,clazz); 
+0

,看你這樣做的遠? – nullpointer

+0

現在我已經添加了我的問題,我是如何解決這個 –

回答

1

不要去想新的日曆(甚至是國慶節的名稱),因爲它是路徑的一部分(或多個),將過程中自動創建插入日期document。在Mongo Shell中的示例:

db.calendars.update(
{"Calendars.MyCalendarX.DateX": {$exists: true} }, 
{$set: {"holidaytype": "CHRISTMAS", "optional": true}}, 
{upsert: true} 
); 

此代碼段創建或更新現有的。

db.calendars.update(
{"Calendars.MyCalendarX.DateX": {$exists: false} }, 
{$set: {"holidaytype": "CHRISTMAS", "optional": true}}, 
{upsert: true} 
); 

這段代碼創建或更新都不存在。

如果MyDiaries的集合名稱,答案是:

db.MyDiaries.update(
{$and: [ {"id": "diary1"}, {"MyCalendarX.DateX": {$exists: true}}] }, 
{$set: {"holidaytype": "CHRISTMAS", "optional": true}}, 
{upsert: true} 
); 
+0

謝謝,如果日曆是集合中的文檔(編輯問題,請檢查),並且必須查詢特定日記,日曆和日期要更新或添加,那麼我們如何包含這個3維查詢。 –

+0

什麼是「MyDiaries」?在另一個文件中的字段?如果是,那麼它是ID呢?或者這是集合名稱(?),並且根文檔帶有ID:「diary1」和「diary2」? 如果「MyDiaries」是集合名稱,則更新 –

+0

如果{「id」:「diary1」},{「MyCalendarX存在但Date不存在,那麼我們必須在mycalendarx中創建一個新日期。 –

相關問題