如何在Java中直接从mongodb查询返回原始JSON?
我有以下代码:如何在Java中直接从mongodb查询返回原始JSON?,java,spring,mongodb,spring-data,spring-data-mongodb,Java,Spring,Mongodb,Spring Data,Spring Data Mongodb,我有以下代码: @RequestMapping(value = "/envinfo", method = RequestMethod.GET) @ResponseBody public Map getEnvInfo() { BasicQuery basicQuery = new BasicQuery("{_id:'51a29f6413dc992c24e0283e'}", "{'envinfo':1, '_id': false }"); Map envinfo= mongoTemp
@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
对象转换为JSON,然后将其返回到浏览器是否可以直接从MongoDb返回原始json而不经过中间转换步骤?正如Oliver所指出的,您可以使用Spring数据,但是您可能喜欢也可能不喜欢使用MongoDb更低级的Java驱动程序。有关使用该驱动程序的说明,请参阅或文档 基本上,您需要做的是: MongoDB Java驱动程序3.x
这将打印出集合中所有具有值为
51a29f6413dc992c24e0283e的字段\u id
的文档。现在有两种方法可以执行此操作:
1.使用MongoTemplate上的CollectionCallback
您可以使用CollectionCallback
直接和简单地处理返回的DBObject
toString()
它:
template.execute("jvmInfo", new CollectionCallback<String>() {
String doInCollection(DBCollection collection) {
DBCursor cursor = collection.find(query)
return cursor.next().toString()
}
}
然后,您可以使用XML配置或重写customConversions()
以返回新的customConversions(Arrays.asList(new DBObjectToStringConverter())
,以便在MongoConverter
中注册它。然后,您可以简单地执行以下操作:
String result = mongoTemplate.findOne(basicQuery, String.class, "jvmInfo");
我将把刚刚展示的转换器添加到Spring Data MongoDB中,并在即将发布的1.3 GA版本中默认注册它,并将修复程序移植回1.2.x,作为的修复程序的一部分。有人对此投了反对票吗?我很想知道它有什么问题。我没有测试它,但它实际上是从文档中复制粘贴的。有三个方面:首先,并不是你不能使用Spring数据。我正要准备一个答案,看看它是如何工作的。其次,您正在将内容转储到标准输出,而不是返回字符串。第三,您的代码没有处理任何异常或类似情况。我知道这是一个示例代码,但如果使用Spring数据,所有这些都是现成的,因此在使用Spring数据实现所有其他内容的场景中使用代码会导致不一致的行为。如果可以使用Spring数据,那么看看如何使用它会很有趣。至于返回字符串,而不处理异常,这些都是非常简单的。任何称职的程序员都能想出如何返回cursor.next()的结果,而不是系统输出。明白了。一般来说,您显示的代码没有问题。只是人们希望在使用SD MongoDB(异常翻译等)时获得特定的行为,而在您的示例中却没有。由于最初的海报似乎使用SD MongoDB作为他的代码,并明确要求使用它,我认为“你应该使用其他东西”并不是处理它的好方法。这就像有人要一个Android应用程序,你告诉他“买个iPhone”:。无意冒犯!我刚刚发布了我的答案:简言之,它将在OOTB中起作用,但现在已经很容易实现了。我有一个问题!我可以用MongoRepository做同样的事情吗?
template.execute("jvmInfo", new CollectionCallback<String>() {
String doInCollection(DBCollection collection) {
DBCursor cursor = collection.find(query)
return cursor.next().toString()
}
}
class DBObjectToStringConverter implements Converter<DBObject, String> {
public String convert(DBObject source) {
return source == null ? null : source.toString();
}
}
String result = mongoTemplate.findOne(basicQuery, String.class, "jvmInfo");