Драйвер Java MongoDB: возврат списка записей БД в виде отдельного объекта

Мой вопрос касается настройки возвращаемого типа из запроса драйвера 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\" }") в конечном результате.


person Mac    schedule 12.12.2013    source источник


Ответы (1)


Результаты запроса из платформы агрегации представляют собой единый документ. Возможно, вы могли бы переписать свой запрос, чтобы использовать агрегат? Может быть, $group по '_id' после совпадения $ по {someField: someValue}?

person Mzzl    schedule 12.12.2013
comment
Это сделало это. Я помещаю подробное объяснение в вопрос. Спасибо! - person Mac; 13.12.2013