簡體   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