我的数据库中有这样的文档:
{ "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>>
。插入数据时,我必须检查特定的日记是否存在,日历是否存在以及日期是否相同。
请让我知道我该怎么做。
我已经有了这个,但它不起作用:
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 :(得分: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}
);