Мой вопрос касается настройки возвращаемого типа из запроса драйвера Java MongoDB.
Я выполняю запрос, который вернет несколько объектов из MongoDB. Я использую драйвер MongoDB Java следующим образом:
DBCollection collection = ...;
DBObject query = new DBObject("someField", "someValue");
collection.find(query);
Это возвращает DBCursor
, который может перебирать набор DBObjects
. Поскольку я хочу вернуть необработанный JSON, я просматриваю каждый объект и использую StringBuilder
для объединения результатов в одну строку (используя DBObject.toString()
). Однако это привело к другим проблемам, поскольку в окончательный результат включены управляющие символы.
В качестве примера, скажем, у меня есть две записи в БД:
{
someField : "someValue"
},
{
someField : "someOtherValue"
}
После получения DBCursor
и построения строки с StringBuilder
окончательный результат:
String s = "{ someField : \"someValue\" }, { someField : \"someOtherValue\" }";
Мое идеальное решение состоит в том, чтобы вернуть один DBObject
и вызвать его метод .toString()
или (что еще более идеально) просто получить этот необработанный штамм из Mongo.
Как всегда, любые мысли или предложения будут с благодарностью.
Спасибо.
ИЗМЕНИТЬ – ОТВЕЧЕН, СПАСИБО, Mzzl
private class SingleStringCollectionCallback implements CollectionCallback {
private final DBObject dbo = new BasicDBObject("someField", "someValue");
private final DBObject match = new BasicDBObject("$match", dbo);
public Object doInCollection(DBCollection collection) throws MongoException, DataAccessException {
AggregationOutput ao = collection.aggregate(match);
/** CommandResult contains the results list (as a BasicDBList) in its "result" field. */
return ao.getCommandResult().get("result");
}
}
mongoTemplate.execute(COLLECTION_NAME, new SingleStringCollectionCallback());
Метод BasicDBList.toString()
сериализует список в одну строку JSON. Обратите внимание, что вы должны позволить выбранному сериализатору JSON обрабатывать вызов toString()
и просто передать ему BasicDBList
. В противном случае вы можете найти escape-символы ("{ someField : \"someValue\" }"
) в конечном результате.