繁体   English   中英

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

[英]How to return raw JSON directly from a mongodb query in Java?

我有以下代码:

@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;
}

你可以注意到,代码:

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

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

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

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()
  }
}

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

2.将ConverterDBObject注册到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修复的一部分。

正如Oliver指出的那样,你可以使用Spring Data,但是你可能喜欢或不喜欢的另一种选择是使用MongoDB更低级的Java驱动程序。 有关使用该驱动程序的说明,请查看MongoDB Java Driver 3.xMongoDB Java Driver 2.x文档。

基本上,你需要做的是:

MongoDB Java Driver 3.x

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());
    }
}

MongoDB Java Driver 2.x

MongoClient mongoClient = new MongoClient();
DB db = mongoClient.getDB("test");
DBCollection coll = db.getCollection("testCollection");    
BasicDBObject query = new BasicDBObject("_id", "51a29f6413dc992c24e0283e");

try (DBCursor cursor = coll.find(query)) {
    while(cursor.hasNext()) {
        System.out.println(cursor.next());
    }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM