2010-12-17 19 views
5

Estoy usando Morphia, el mapeador Pojo para MongoDB, y encuentro una tarea difícil que en mi opinión debería ser muy simple: obtener un objeto por identificación. Puedo encontrar todos los objetos en una colección pero no puedo entender la simple tarea de consultar usando una identificación que obtuve de la lista. En realidad, estoy hablando del ObjectId. Si intento renderizarlo en JSON, veoConsultando Morphia por Id

Respuesta

14

Esta pregunta parece incompleta.

También parece que la respuesta a su pregunta está en el Morphia QuickStart page. Parece ser tan simple como sigue.

Datastore ds = morphia.createDatastore("testDB"); 
String hotelId = ...; // the ID of the hotel we want to load 
// and then map it to our Hotel object 
Hotel hotel = ds.get(Hotel.class, hotelId); 

Así que definitivamente necesitará más detalles.

+5

nunca se olvide de añadir "Identificación del @Id OBJECTID" a la entidad. Te hace la vida más fácil. – caarlos0

7
Datastore ds = morphia.createDatastore("testDB"); 
String hotelId = "516d41150364a6a6697136c0"; // the ID of the hotel we want to load 
ObjectId objectId = new ObjectId(hotelId); 
// and then map it to our Hotel object 
Hotel hotel = ds.get(Hotel.class, objectId); 
+0

¿Puedes explicar por qué funciona tu código o qué está haciendo? Las mejores respuestas explican la solución, en lugar de solo el código de funcionamiento. – nathangiesbrecht

+0

@nathangiesbrecht En la [respuesta] anterior (http://stackoverflow.com/a/4475711/1094584) es incorrecto. MongoDB Id no es el tipo String. El tipo de ID de MongoDB es ObjectId (org.bson.types.ObjectId). –

5

Si usted está encontrando por id y la identificación es proporcionada por el usuario (significa que podría ser cualquier tipo de datos), no debería utilizar las soluciones dadas anteriormente.

Como se explica en la documentation, un OBJECTID consta de 12 bytes, por lo que si pasa algo más para new ObjectId(myValue), el código generará un IllegalArgumentException.

Aquí es cómo he implementado el método para encontrar por id:

public Model findById(String id) throws NotFoundException { 
    if (!ObjectId.isValid(id)) { 
     throw new NotFoundException(); 
    } 

    ObjectId oid = new ObjectId(id); 
    Model m = datastore().find(Model.class).field("_id").equal(oid).get(); 
    if (m == null) { 
     throw new NotFoundException(); 
    } 
    return m; 
} 
+0

Si el ID no es un ObjectId válido, * debe * arrojar una IllegalArgumentException, no una NotFoundException. – metaforge