[英]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;
}
你可以注意到,代碼:
Map
對象 Map
則返回到瀏覽器之前的對象,然后由Spring MongoData轉換成JSON。 是否可以直接從MongoDb返回原始json而無需經過中間轉換步驟?
現在有兩種方法可以做到這一點:
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
時必須要注意的事情。
Converter
從DBObject
注冊到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.x或MongoDB Java Driver 2.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());
}
}
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.