2011-10-10 20 views
6

Im completamente nuevo en MongoDb y Morphia y
tratando de aprender cómo actualizar mi documento.morphia y cómo actualizar el campo del documento existente

no puedo ver/entender cómo hacerlo de esta página:
http://www.mongodb.org

Mi documento se ve de la siguiente manera: (podría haber algún error aquí)

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

En esa página no puedo ver cualquier lugar donde se describen Cómo actualizar mi UserData que tiene una específica uUid
Como update UserData.status si uUid=123567

Esto es lo que creo que debo usar:

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

// actualización predeterminada morfina es actualizar todo el documento UserData así comos actualización seleccionados

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

Respuesta

7

supongo que esto es lo que quiere :

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

ds.update(query, ops); 
+0

sí, ¿por qué esa página a la que me refiero no tiene esa información? ¿O lo extrañé, o esta no es una forma normal de enviar documentos dentro de una colección? – Erik

2

La interfaz de la morfina es un poco torpe, y los documentos no están claras, pero ... un método para actualizar o ólo un único documento específico es en realidad demostró en 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); 

Además, a different documentation page muestra una forma inteligente para ocultar esa consulta engorroso dentro de la clase de entidad en sí:

@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

me gusta esconder la consulta que muestra. ¿Cómo llamaría al método 'loggedIn()'? Necesito crear una consulta para el 'Usuario' específico ¿verdad? y luego llamar a 'loggedIn()'? ¿No tendría que sacar todo el objeto 'Usuario' o puedo acortar el código java? – Erik

+0

@Erik: 'loggedIn()' es un método de conveniencia de la clase 'User'. Supone que ya ha llenado un objeto 'Usuario' con un documento de la base de datos de Mongo. Hay otras formas de comprobar sin extraer todo el objeto 'Usuario'. Al igual que los métodos estáticos de la clase 'User' o la implementación en una clase' User * DAO * ': http://code.google.com/p/morphia/wiki/DAOSupport – Leftium

Cuestiones relacionadas