我有以下代码:
@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;
}
您可以注意到,代码:
Map
对象Map
对象转换为Spring MongoData的JSON,然后再将其返回给浏览器。是否可以直接从MongoDb返回原始json而无需经过中间转换步骤?
答案 0 :(得分:19)
现在有两种方法可以做到这一点:
CollectionCallback
MongoTemplate
您可以使用CollectionCallback
直接处理返回的DBObject
,只需toString()
处理它:
template.execute("jvmInfo", new CollectionCallback<String>() {
String doInCollection(DBCollection collection) {
DBCursor cursor = collection.find(query)
return cursor.next().toString()
}
}
Yo仍然可以将异常翻译成Spring的DataAccessExceptions
。请注意,这有点脆弱,因为我们预计只会为查询返回一个结果,但这可能是您在尝试生成String
时必须要注意的事情。
Converter
到DBObject
String
您可以实现Spring Converter
为您执行toString()
。
class DBObjectToStringConverter implements Converter<DBObject, String> {
public String convert(DBObject source) {
return source == null ? null : source.toString();
}
}
然后,您可以使用XML配置或覆盖customConversions()
返回new CustomConversions(Arrays.asList(new DBObjectToStringConverter()))
,以便在MongoConverter
中注册。然后,您可以简单地执行以下操作:
String result = mongoTemplate.findOne(basicQuery, String.class, "jvmInfo");
我将刚刚显示的转换器添加到Spring Data MongoDB并默认为即将发布的1.3 GA版本注册,并将修复程序移回1.2.x作为DATAMONGO-743修复的一部分。
答案 1 :(得分:9)
正如Oliver指出的那样,你可以使用SpringData,但是你可能喜欢或不喜欢的替代方法是使用mongoDb更低级的Java驱动程序。请查看these docs以了解如何使用该驱动程序。
基本上,你需要做的是:
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();
}
这将打印出集合中具有值_id
的字段51a29f6413dc992c24e0283e
的所有文档。