29

我有以下代码:

@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 而无需经过中间转换步骤?

4

3 回答 3

22

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

1.使用CollectionCallbackMongoTemplate

您可以使用 a直接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.注册一个ConverterDBObjectString

你可以实现一个 SpringConvertertoString()为你做这件事。

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

然后,您可以使用 XML 配置或覆盖customConversions()返回 anew 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修复的一部分。

于 2013-08-20T06:03:55.970 回答
9

正如 Oliver 指出的那样,您可以为此使用 Spring Data,但您可能更喜欢也可能不喜欢的替代方法是使用 MongoDB 的更底层的 Java 驱动程序。查看MongoDB Java Driver 3.xMongoDB Java Driver 2.x文档以获取有关使用该驱动程序的说明。

基本上,您需要做的是:

MongoDB Java 驱动程序 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 驱动程序 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());
    }
}

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

于 2013-08-19T00:34:06.663 回答
0

对我来说,以下工作完美:

import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.bson.Document;

List<Document> documents = mongoTemplate.find(query, Document.class, "collection_name");
于 2021-08-12T10:24:23.163 回答