如何直接从Java中的mongodb查询返回原始JSON?MongoDB Java Driver 3.xMongoDB Java Driver 2.x

我有以下代码:

@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. 然后,该对象在返回到浏览器之前由Spring MongoData转换为JSON。Map

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


答案 1

您现在可以通过两种方式执行此操作:

1. 使用 onCollectionCallbackMongoTemplate

您可以使用 a 直接处理返回的,只需它:CollectionCallbackDBObjecttoString()

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

Yo's 仍然会得到例外的翻译到春天的 .请注意,这有点脆弱,因为我们期望只为查询返回一个结果,但这可能是您在尝试生成查询时必须注意的问题。DataAccessExceptionsString

2. 注册一个从 到ConverterDBObjectString

你可以实现一个弹簧来为你做。ConvertertoString()

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修复程序的一部分。


答案 2

正如Oliver所指出的,你可以使用Spring Data来实现这一点,但你可能会喜欢也可能不喜欢的替代方案是使用MongoDB的更低级的Java驱动程序。请查看 MongoDB Java 驱动程序 3.xMongoDB Java 驱动程序 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());
    }
}

这将打印出集合中具有值的字段的所有文档。_id51a29f6413dc992c24e0283e