有没有一种方法可以将FindIterable <document>转换为JSONArray字符串?

时间:2018-09-04 14:56:04

标签: java json mongodb

我有这样的东西

MongoClient mongoClient = new MongoClient();
MongoDatabase database = mongoClient.getDatabase(db);
MongoCollection<Document> collection = database.getCollection(col);

FindIterable<Document> results = collection.find();

我可以使用以下方法获取JSONArray字符串:

JSON.serialize(results)

,但最新版本的mongodb驱动程序已弃用该功能。

在MongoDB shell中,我可以使用:

db.$.find().toArray();

但是我在Java驱动程序中找不到类似的东西。

我解决了使用列表并遍历光标的问题。

MongoCursor<Document> cursor = results.iterator();
List<String> list = new ArrayList<String>(); 

while(cursor.hasNext())
    list.add(cursor.next().toJson());

return list.toString();

请随时提出更好的解决方案。

2 个答案:

答案 0 :(得分:1)

在可迭代的对象上使用spliterator(),然后进行流处理,映射到String并收集:

StreamSupport.stream(collection.find().spliterator(), false)
        .map(Document::toJson)
        .collect(Collectors.joining(", ", "[", "]"))

请注意,并行流式处理不适用于mongo结果,因此请将parallel标志保持为false

答案 1 :(得分:0)

请注意,this answer可能会导致资源泄漏,因为在BEGIN SELECT sel_extreme.ext, sel_regular.reg FROM (SELECT sel.extreme as 'ext' FROM (SELECT CASE WHEN vitamin_name LIKE 'extreme%' THEN price END AS 'extreme' FROM vitamin) AS sel WHERE sel.extreme IS NOT NULL;) AS sel_extreme <-- line 9 CROSS JOIN (SELECT sel.regular as 'reg' FROM (SELECT CASE WHEN vitamin_name NOT LIKE 'extreme%' THEN price END AS 'regular' FROM vitamin) AS sel WHERE sel.regular IS NOT NULL;) AS sel_regular; END 内创建的迭代器永远不会关闭,并且需要将迭代器返回到连接池。 要解决此问题,您需要执行以下操作:

collection.find().spliterator()

或者不使用流:

try (MongoCursor<Document> cursor = collection.find().iterator()) {
    return StreamSupport.stream(Spliterators.spliteratorUnknownSize(cursor,0), false)
                        .map(Document::toJson)
                        .collect(Collectors.toList())
}

在这种情况下,资源(MongoCursor)也已正确关闭。