如何直接从Java中的mongodb查询返回原始JSON?

pde*_*eva 26 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= mongoTemplate.findOne(basicQuery, Map.class, "jvmInfo");
    return envinfo;
}
Run Code Online (Sandbox Code Playgroud)

你可以注意到,代码:

  1. 从MongoDB中检索JSON
  2. 将其转换为Map对象
  3. Map然后,Spring MongoData 将对象转换为JSON,然后返回到浏览器.

是否可以直接从MongoDb返回原始json而无需经过中间转换步骤?

Oli*_*ohm 19

现在有两种方法可以做到这一点:

1.使用CollectionCallbackonMongoTemplate

您可以使用a CollectionCallbackDBObject直接处理返回并简单地toString()处理:

template.execute("jvmInfo", new CollectionCallback<String>() {
  String doInCollection(DBCollection collection) {
    DBCursor cursor = collection.find(query)
    return cursor.next().toString()
  }
}
Run Code Online (Sandbox Code Playgroud)

你还会得到Spring的异常翻译DataAccessExceptions.请注意,这有点脆弱,因为我们预计只会为查询返回一个结果,但这可能是您在尝试生成一个时必须要注意的事情String.

2.注册一个ConverterDBObjectString

你可以实现一个Spring ConvertertoString()为你做.

class DBObjectToStringConverter implements Converter<DBObject, String> {
  public String convert(DBObject source) {
    return source == null ? null : source.toString();
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用XML配置或覆盖customConversions()返回a new CustomConversions(Arrays.asList(new DBObjectToStringConverter()))以使其注册MongoConverter.然后,您可以简单地执行以下操作:

String result = mongoTemplate.findOne(basicQuery, String.class, "jvmInfo");
Run Code Online (Sandbox Code Playgroud)

我将刚刚显示的转换器添加到Spring Data MongoDB并默认为即将发布的1.3 GA版本注册它,并将修复程序移回1.2.x作为DATAMONGO-743修复的一部分.

  • 我有个问题!我可以使用MongoRepository做同样的事吗? (2认同)

Cor*_*han 9

正如Oliver指出的那样,你可以使用SpringData,但是你可能喜欢或不喜欢的替代方法是使用mongoDb更低级的Java驱动程序.看看这些文档,看看如何使用该驱动程序.

基本上,你需要做的是:

MongoClient mongoClient = new MongoClient();
MongoDatabase db = mongoClient.getDatabase("test");
MongoCollection coll = db.getCollection("testCollection");    
BasicDBObject query = new BasicDBObject("_id", "51a29f6413dc992c24e0283e");

try (MongoCursor<Document> cursor = collection.find(query).iterator()) {
    while(cursor.hasNext()) {
        System.out.println(cursor.next());
    }
}
Run Code Online (Sandbox Code Playgroud)

这将打印出集合中具有_id值的字段的所有文档51a29f6413dc992c24e0283e.

  • 如果你能用弹簧数据做到这一点,看看你是如何做到这一点会很有趣.至于返回一个字符串,而不是处理异常,那些非常简单.任何值得盐的程序员都可以弄清楚如何返回`cursor.next()`的结果而不是系统输出它. (5认同)
  • 有人贬低了这个?有兴趣知道它有什么问题.我没有测试它,但它实际上是从文档中复制粘贴的. (2认同)