MongoOperations - upsert / findAndModify удаляя все поля в монго - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь использовать MongoOperarions, и метод upsert только для обновления / создания тех полей, которые присутствуют в параметре обновления.Но всякий раз, когда я отправляю пустой список полей для обновления, он удаляет все остальные поля в базе данных, оставаясь единственным, оставшим поле «Я». Ребята, вы знаете способ избежать этого??В идеале, я ожидал бы, что он просто скажет мне, что ничего не было сделано, вместо того, чтобы удалить все.

РЕДАКТИРОВАТЬ 1

Вот как выглядит мой код:

Query query = new Query();
        query.addCriteria(Criteria.where("id").is(id));
        final Update update = new Update();
        fields.entrySet().stream()
                .forEach(entry->{
                    if(entry.getValue()!=null)
                        update.set(entry.getKey(),entry.getValue());
                });

        return mongoOperation.findAndModify(query,update,Destination.class);

Как видите, я использую операцию $set для обновления.Что происходит в моем сценарии, так это то, что переменная обновления не имеет парного значения поля, подлежащего обновлению, и в конечном итоге удаляет все под заданным идентификатором.

Ответы [ 2 ]

0 голосов
/ 21 июня 2019

Я закончил тем, что отфильтровал все вызовы, у которых не было полей для обновления, прежде чем перейти к комментарию об обновлении.

0 голосов
/ 13 июня 2019

Вам нужно использовать $set для этого: https://docs.mongodb.com/manual/reference/operator/update/set/

Таким образом, если у вас есть документ с user id, name и age, например, следующий документ заменит весь документ, и вы потеряете возраст:

{
    id: 1,
    name: 'new name'
}

Но использование $set обновит или добавит только поля из запроса, поэтому поле возраста не будет потеряно

{
    '$set': {
        id: 1,
        name: 'new name'
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...