web-dev-qa-db-ja.com

Javaでmongodbクエリから生のJSONを直接返す方法は?

私は次のコードを持っています:

@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を直接返すことは可能ですか?

26
pdeva

すぐにこれを行うには、2つの方法があります。

1. CollectionCallbackMongoTemplateを使用する

CollectionCallbackを使用して、返されたDBObjectを直接処理し、単純にtoString() it処理できます。

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

例外は、SpringのDataAccessExceptionsに引き続き翻訳されます。クエリに対して返される結果は1つだけであると予想されるため、これはやや脆弱ですが、おそらくStringを生成しようとする場合は注意が必要です。

2. ConverterからDBObjectStringを登録します

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-74

19
Oliver Drotbohm

Oliverが指摘しているように、そのためにSpring Dataを使用できますが、MongoDBのより低レベルのJava Driver。を見てください。 MongoDB Java Driver 3.x または MongoDB 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());
    }
}
_

これにより、値__id_を持つフィールド_51a29f6413dc992c24e0283e_を持つコレクション内のすべてのドキュメントが印刷されます。

9
CorayThan