2017-05-20 1 views
0

Je me demandais que je suis en train de mettre à jour un ou deux propriété d'un Document de collectionuser ayant une propriété tels queModifier une propriété d'un document à l'aide des données de printemps mongodb

{ 
    "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 
} 

Supposons que je voulais mettre à jour usernom seulement et si je courais save avec la commande suivante:

userRepository.save(userEntity); 

Il a changé mon utilisateur comme:

{ 
    "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 
} 

Mais Idéalement je veux changer mon nom de l'utilisateur seulement.

Mon contrôleur utilisateur est:

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

Mon serviceImpl est:

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

Mon mongoRepository est:

public interface UserRepository extends MongoRepository<User, String> 

S'il vous plaît aidez-moi à y parvenir d'une manière correcte avec Spring-data-mongodb.

+0

Cela aidera. http://docs.spring.io/spring-data/data-mongo/docs/current/reference/html/#mongodb-template-update – Veeram

+0

vous devez utiliser MongoTemplate pour cela – pvpkiran

Répondre

1

Comme les gars ont écrit dans les commentaires, vous devriez créer une méthode de mise à jour personnalisée pour cela.

d'abord créer une interface pour les méthodes personnalisées:

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

puis l'ajouter à UserRepository:

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

et mise en œuvre pour elle:

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

Aussi, vous devriez toujours mettre à jour uniquement champs que vous souhaitez mettre à jour. Save méthode devrait être utilisée rarement.