2017-08-31 20 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に新しい日付を作成する必要があります。 –

関連する問題