Mongodb如何查询和更新数据,如Map <string,map <string,=“”object =“”>&gt;

时间:2017-08-31 13:47:59

标签: java mongodb aggregate-functions

我的数据库中有这样的文档:

{ "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. 如果日历本身不存在,那么我们必须创建一个新日历。
  4. 请让我知道我该怎么做。

    我已经有了这个,但它不起作用:

    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);
    

1 个答案:

答案 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}
);