我的数据库中有一个这样的文档:
{ "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
}
}
}
]
}
它是Map<MyCalendarString, Map<DateString, Object>>
在 java 。在插入数据时,我必须检查特定的日记和日历是否存在,以及它们是否具有相同的日期。
- 如果是这样,那么我们必须覆盖。
- 如果没有,那么我们必须插入日历中不存在的日期。
- 如果日历本身不存在,那么我们必须创建一个新日历。
请让我知道我该怎么做。
我已经有了这个,但它不起作用:
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);
最佳答案
不要考虑新的日历(甚至日期名称),因为它是路径的一部分,并且将在日期文档
插入期间自动创建。 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}
);
关于java - Mongodb如何查询和更新这样的数据 Map<String, Map<String, Object>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45983092/