Изменение некоторого свойства документа с использованием данных Spring mongodb

Мне интересно, что я пытаюсь обновить одно или два свойства документа из коллекции user, имеющей какое-то свойство такие как

{
  "id": "591fcd33f8bb03598ec34f70",
  "name": null,
  "username": "abc",
  "emailId": "[email protected]",
  "interestedFlag": 1,
  "mobNo": "xxxxxxxxxx",
  "userActiveFlag": 1,
  "address": "1",
  "city": "abx",
  "state": "up",
  "profileImage": [
    {}
  ],
  "joinedOn": null,
  "modifiedOn": null,
  "lastVisited": null,
  "tempPassword": "1234567",
  "sex": null,
  "metaDataMap": {},
  "dob": null
}

Предположим, я хочу обновить только user имя и запускаю save с помощью следующей команды:

userRepository.save(userEntity);

Он изменил моего пользователя как:

{
  "id": "591fcd33f8bb03598ec34f70",
  "name": "New Name",
  "username": null,
  "emailId": null,
  "interestedFlag": null,
  "mobNo": null,
  "userActiveFlag": null,
  "address": null,
  "city": null,
  "state": null,
  "profileImage": null,
  "joinedOn": null,
  "modifiedOn": null,
  "lastVisited": null,
  "tempPassword": null,
  "sex": null,
  "metaDataMap": {},
  "dob": null
}

Но в идеале я хочу изменить только свое имя пользователя .

Мой пользовательский контроллер:

@PATCH
@Path("/changepassword/{userId}")
@Consumes("application/json")
public User changeName(@PathParam("userId") String userId, final User user) {
    userService.changePassword(user);
    return user;
}

Мой serviceImpl:

@Override
public User changeName(User user){
    User userEntity = userRepository.findById(user.getId());
    userEntity.setName(user.getName());
    return userRepository.save(userEntity);
}

Мой mongoRepository:

public interface UserRepository extends MongoRepository<User, String>

Пожалуйста, помогите мне правильно добиться этого с помощью Spring-data-mongodb .


person CandleCoder    schedule 20.05.2017    source источник
comment
Это поможет. docs.spring.io /spring-data/data-mongo/docs/current/reference/   -  person s7vr    schedule 20.05.2017
comment
вы должны использовать MongoTemplate для этого   -  person pvpkiran    schedule 20.05.2017


Ответы (1)


Как писали ребята в комментариях, вы должны создать для этого собственный метод обновления.

Сначала создайте интерфейс для пользовательских методов:

interface UserRepositoryCustom {
   void updateName(String userId, String newName);
}

Затем добавьте его в UserRepository:

public interface UserRepository extends MongoRepository<User, String>, UserRepositoryCustom

И реализация для него:

public class UserRepositoryImpl implements UserRepositoryCustom {

    private final MongoTemplate mongoTemplate;

    public UserRepositoryImpl(@Autowired final MongoTemplate mongoTemplate) {
        this.mongoTemplate = mongoTemplate;
    }

    @Override
    public void updateName(final String id, final String newName) {
        mongoTemplate
                .updateFirst(Query.query(Criteria.where(Entity.Meta.ID).is(id)),
                        Update.update("name", newName), User.class);
    }
}

Также вы всегда должны обновлять только те поля, которые хотите обновить. Метод Save следует использовать редко.

person Orest    schedule 29.05.2017