我有这样的东西
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();
请随时提出更好的解决方案。
答案 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)也已正确关闭。