java - Mongodb如何查询和更新这样的数据 Map<String, Map<String, Object>>

标签 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
                }
            }
        }
    ]
    }

它是Map<MyCalendarString, Map<DateString, Object>>在 java 。在插入数据时,我必须检查特定的日记和日历是否存在,以及它们是否具有相同的日期。

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

最佳答案

不要考虑新的日历(甚至日期名称),因为它是路径的一部分,并且将在日期文档插入期间自动创建。 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/

相关文章:

sql - 将 SQL 查询限制为每个组的前两个计数

java - "invalid command-line parameter"尝试为 Android 制作一个 hello world 示例时出错

java - 如何使用 Jetty Client 根据请求获取 bytesIn/bytesOut

java - PhoneDirectory 程序中的 NullPointerException

java - 我怎样才能在 Java 中获得与过时的 Swift 代码相同的字节数?

node.js - 为什么 express 告诉我我的默认 View 引擎没有定义?

python - 为什么 PyMongo 3 给出 ServerSelectionTimeoutError?

mongodb - 如何在 mongo 控制台中通过 ObjectId 搜索对象?

mysql - 无法在 MySQL 中使用具有特定 GROUP BY 条件的 AVG 值进行 ORDER BY

aggregate-functions - 一种点对点和隐私感知的数据挖掘/聚合算法 : is it possible?