MongoDB Java驱动程序:将DB记录列表作为单个对象返回

时间:2013-12-12 13:59:25

标签: mongodb-java

我的问题是从MongoDB Java驱动程序查询配置返回的类型。

我正在执行一个查询,它将从MongoDB返回多个对象。我正在使用MongoDB Java驱动程序,如下所示:

DBCollection collection = ...;
DBObject query = new DBObject("someField", "someValue");

collection.find(query);

这会返回DBCursor,它可以遍历一组DBObjects。由于我想返回原始JSON,因此我遍历每个对象并使用StringBuilder将结果聚合为单个String(使用DBObject.toString())。这虽然解决了其他问题,因为转义字符包含在最终结果中。

举个例子,假设我在DB中有两条记录:

{
    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。否则,您可能会在最终结果中找到转义字符("{ someField : \"someValue\" }")。

1 个答案:

答案 0 :(得分:2)

汇总框架的查询结果是单个文档。也许您可以重写查询以使用aggregate?在'someField:someValue}的$ match之后,'_id'可能是$ group?