Обновление в монгодб

У меня есть приложение, в котором я использую структуру Spring и использую mongoDB в качестве базы данных. У меня есть коллекция, которая индексируется по электронной почте. Поля:

{
    email: <email>
    profile: {
        name: <name>
        age: <age>
        customMap: {
        }
    }
}

Это документ:

@Document(collection = "user")
class User {
    String email;
    Profile profile;
}

class Profile {
    String name;
    int age;
    Map customMap;
}

Вариант использования заключается в том, что поле электронной почты уникально. Поэтому, когда приходит запрос с существующим электронным письмом, мне нужно обновить документ с новым профилем. Я могу вставить новый документ с вызовом mongoOperations.save. Но при обновлении, если я передаю customProfile с новой картой, я получаю

java.lang.IllegalArgumentException: [Assertion failed] - this argument is required; it must not be null

Как ошибка. Но если я попытаюсь обновить только поле age, оно будет успешно обновлено. У меня проблема только с использованием карты, и я использую HashMap.

Это код для обновления:

Update update = new Update();
Profile profile = new Profile();
profile.setAge(10);
Map customMap = new HashMap();
customMap.put("name", "value");
profile.setCustomMap(customMap);
update.set("profile", profile);
mongoOperations.updateFirst(query, update, User.class);

Если я закомментирую profile.setCustomMap(customMap);, он успешно обновится. Я что-то пропустил здесь?


person coder    schedule 07.05.2014    source источник
comment
Заголовок stackoverflow.com/questions/3580529/ Кажется, это может быть полезно.   -  person Arun A K    schedule 07.05.2014
comment
@ArunAK В приведенном выше примере Spring не используется. Единственная проблема, с которой я сталкиваюсь, это когда я ввожу карту.   -  person coder    schedule 07.05.2014


Ответы (1)


Обязательно установите адрес электронной почты в объекте пользователя. В противном случае БД не будет знать, какого пользователя обновлять.

person Gordon Mohrin    schedule 07.05.2014
comment
пользовательский объект имеет адрес электронной почты. Запрос: query.addCriteria(Criteria.where(email).is(user.getEmail())); Хуже всего то, что он не показывает, что является нулевым в трассировке стека. Все, что я получаю, это то, что этот аргумент требуется; он не должен быть нулевым - person coder; 07.05.2014
comment
Вы можете использовать инструмент управления MongoDB, чтобы увидеть свою базу данных. Я использую его robomongo.org - person jmen7070; 07.05.2014