java - recorrer - rangos en mongodb
¿Cómo devolver JSON en bruto directamente desde una consulta mongodb en Java? (2)
Como señala Oliver, puedes usar SpringData para eso, pero una alternativa que puedes o no preferir sería usar el controlador Java de más bajo nivel de mongoDb. Eche un vistazo a estos documentos para ver cómo usar ese controlador.
Básicamente, lo que necesitas hacer es esto:
MongoClient mongoClient = new MongoClient();
DB db = mongoClient.getDB("test");
DBCollection coll = db.getCollection("testCollection");
BasicDBObject query = new BasicDBObject("_id", "51a29f6413dc992c24e0283e");
DBCursor cursor = coll.find(query);
try {
while(cursor.hasNext()) {
System.out.println(cursor.next());
}
} finally {
cursor.close();
}
Eso imprimirá todos los documentos de la colección que tengan un campo _id
con un valor 51a29f6413dc992c24e0283e
.
Tengo el siguiente código:
@RequestMapping(value = "/envinfo", method = RequestMethod.GET)
@ResponseBody
public Map getEnvInfo()
{
BasicQuery basicQuery = new BasicQuery("{_id:''51a29f6413dc992c24e0283e''}", "{''envinfo'':1, ''_id'': false }");
Map envinfo= mongoTemplate.findOne(basicQuery, Map.class, "jvmInfo");
return envinfo;
}
Como puedes observar, el código:
- Recupera JSON de MongoDB
- Lo convierte en un objeto
Map
- Spring MongoData convierte el objeto de
Map
a JSON antes de devolverlo al navegador.
¿Es posible devolver directamente el json sin procesar desde MongoDb sin pasar por los pasos de conversión intermedios?
Hay dos formas en que puedes hacer esto ahora mismo:
1. Usando el CollectionCallback
en MongoTemplate
Puede usar un CollectionCallback
para tratar con el DBObject
devuelto directamente y simplemente toString()
:
template.execute("jvmInfo", new CollectionCallback<String>() {
String doInCollection(DBCollection collection) {
DBCursor cursor = collection.find(query)
return cursor.next().toString()
}
}
Aún obtendré la traducción de excepción a las DataAccessExceptions
de Spring. Tenga en cuenta que esto es un poco frágil, ya que esperamos que solo se devuelva un solo resultado para la consulta, pero probablemente sea algo de lo que tenga que ocuparse cuando intente producir una String
todos modos.
2. Registrar un Converter
de DBObject
a String
Puede implementar un Converter
Spring para hacer el toString()
por usted.
class DBObjectToStringConverter implements Converter<DBObject, String> {
public String convert(DBObject source) {
return source == null ? null : source.toString();
}
}
Luego puede usar la configuración XML o anular customConversions()
para devolver una new CustomConversions(Arrays.asList(new DBObjectToStringConverter()))
para registrarla con su MongoConverter
. A continuación, puede simplemente hacer lo siguiente:
String result = mongoTemplate.findOne(basicQuery, String.class, "jvmInfo");
Agregaré el convertidor que se acaba de mostrar a Spring Data MongoDB y lo registraré de manera predeterminada para la próxima versión 1.3 GA y llevaré la solución a 1.2.x como parte de la solución para DATAMONGO-743 .