2011-10-10 5 views
6

Im complètement nouveau à MongoDb et Morphia et
en essayant d'apprendre comment mettre à jour mon document.morphia et comment mettre à jour le champ de document existant

Je ne peux pas voir/comprendre comment le faire de cette page:
http://www.mongodb.org

Mon document se présente comme suit: (peut-être une erreur ici)

@Entity 
public class UserData { 

    private Date creationDate; 
    private Date lastUpdateDate; 

    @Id private ObjectId id; 
    public String status= ""; 
    public String uUid= ""; 


    public UserData() { 
     super(); 
     this.statistic = new Statistic(); 
     this.friendList = new FriendList(); 
    } 

    @Embedded 
    private Statistic statistic; 
    @Embedded 
    private FriendList friendList; 

    @PrePersist 
    public void prePersist() { 
     this.creationDate = (creationDate == null) ? new Date() : creationDate; 
     this.lastUpdateDate = (lastUpdateDate == null) ? creationDate : new Date(); 
    } 
} 

Sur cette page je ne peux pas voir un endroit où ils décrivent howto mettre à jour mon UserData qui a un uUid
spécifique comme update UserData.status si uUid=123567

C'est ce que je pense que je devrais utiliser:

ops=datastore.createUpdateOperations(UserData.class).update("uUid").if uuid=foo..something more here.. 

// mise à jour par défaut morphia est de mettre à jour tout le document UserData si la mise à jour de howto sélectionnés

datastore.update(datastore.createQuery(UserData.class), ops); 

Répondre

7

Je suppose que cela est ce que vous voulez :

query = ds.createQuery(UserData.class).field("uUid").equal("1234"); 
ops = ds.createUpdateOperations(UserData.class).set("status", "active"); 

ds.update(query, ops); 
+0

oui, pourquoi ne pas cette page je me réfère à avoir cette information. Ou l'ai-je manqué, ou est-ce que ce n'est pas une manière normale d'adresser des documents à l'intérieur d'une collection? – Erik

2

L'interface est un peu morphia maladroit et les documents ne sont pas claires ... mais une méthode de mise à jour o eul un document unique et spécifique, est en fait démontré sur the page Erik referenced:

// This query will be used in the samples to restrict the update operations to only the hotel we just created. 
// If this was not supplied, by default the update() operates on all documents in the collection. 
// We could use any field here but _id will be unique and mongodb by default puts an index on the _id field so this should be fast! 
Query<Hotel> updateQuery = datastore.createQuery(Hotel.class).field("_id").equal(hotel.getId()); 

...

// change the name of the hotel 
ops = datastore.createUpdateOperations(Hotel.class).set("name", "Fairmont Chateau Laurier"); 
datastore.update(updateQuery, ops); 

En outre, a different documentation page montre une façon intelligente de cacher cette requête lourde à l'intérieur du classe d'entité elle-même:

@Entity 
class User 
{ 
    @Id private ObjectId id; 
    private long lastLogin; 
    //... other members 

    private Query<User> queryToFindMe() 
    { 
     return datastore.createQuery(User.class).field(Mapper.ID_KEY).equal(id); 
    } 

    public void loggedIn() 
    { 
     long now = System.currentTimeMillis(); 
     UpdateOperations<User> ops = datastore.createUpdateOperations(User.class).set("lastLogin", now); 
     ds.update(queryToFindMe(), ops); 
     lastLogin = now; 
    } 
} 
+0

J'aime la dissimulation de la requête que vous montrez. Comment appellerais-je la méthode 'loggedIn()'? J'ai besoin de créer une requête pour le droit 'User' spécifique? puis appelez le 'loggedIn()'? Est-ce que je n'aurais pas à retirer tout l'objet 'User' ou est-ce que je peux raccourcir le code java? – Erik

+0

@Erik: 'loggedIn()' est une méthode pratique de la classe 'User'. Il suppose que vous avez déjà rempli un objet 'User' avec un document de la base de données Mongo. Il existe d'autres moyens de vérifier sans extraire tout l'objet 'User'. Comme les méthodes statiques de la classe 'User' ou l'implémentation dans une classe' User * DAO * ': http://code.google.com/p/morphia/wiki/DAOSupport – Leftium

Questions connexes