2011-10-10 14 views
6

Im completamente nuovo per MongoDb e Morphia e
cercando di imparare come aggiornare il mio documento.morphia e howto aggiornare il campo del documento esistente

Non riesco a vedere/capire come farlo da questa pagina:
http://www.mongodb.org

mio documento appare come segue: (potrebbe essere qualche errore qui)

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

In quella pagina non riesco a vedere qualsiasi luogo in cui essi descrivono aggiornare howto mia UserData che ha una specifica uUid
Come update UserData.status se uUid=123567

Questo è quello che penso dovrei usare:

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

// aggiornamento morfina predefinito è quello di aggiornare tutti i documenti in modo UserData aggiornamento howto quelli

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

risposta

7

Credo selezionato questo è ciò che si vuole :

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

ds.update(query, ops); 
+0

sì, perché non quella pagina mi riferisco ad avere quell'informazione. O mi mancava, o non è questo un modo normale per indirizzare i documenti all'interno di una collezione? – Erik

2

L'interfaccia morfina è un po 'goffa ei documenti non sono chiare ... ma un metodo per aggiornare o olo un unico documento specifico è effettivamente dimostrata 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); 

Inoltre, a different documentation page mostra un modo intelligente per nascondere tale query ingombrante all'interno classe di entità stessa:

@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

Mi piace il nascondiglio della query che mostri. Come chiamerei il metodo 'loggedIn()'? Devo creare una query per lo specifico 'utente' giusto? e quindi chiama 'loggedIn()'? Non dovrei estrarre l'intero oggetto 'Utente' o posso accorciare il codice java? – Erik

+0

@Erik: 'loggedIn()' è un metodo di convenienza della classe 'Utente'. Si presuppone che tu abbia già popolato un oggetto 'Utente' con un documento dal database Mongo. Ci sono altri modi per controllare senza estrarre l'intero oggetto 'Utente'. Come i metodi statici della classe 'User' o l'implementazione in una classe' User * DAO * ': http://code.google.com/p/morphia/wiki/DAOSupport – Leftium

Problemi correlati