如何使用 mongo Java 驱动程序 3.0+ 检查集合中是否存在文档 [英] How to check if document exists in collection using mongo Java driver 3.0+
问题描述
使用新的3.0+ java驱动 来自 mongo 检查文档是否存在于集合中的最佳方法是什么.
Using the new 3.0+ java driver from mongo what is the best way to check if a document exists in a collection.
我看过这里 并尝试做类似的事情.我只得到了这个:
I have looked at here and tried to do something similar. I have only gotten as far as this:
FindIterable<Document> iterable = collection.find(eq("code", "abcdefg")).projection(Projections.include("_id")).limit(1);
这将返回一个 FindIterable 但你如何检查它是否找到了任何东西?如果可以,请提供代码示例.
This returns a FindIterable but how do you check it has found anything at all ? If you can please provide a code example.
我确实尝试过:
if (!iterable.first().isEmpty()){System.out.println(" RESILT IS FOUND ");}else{System.out.println(" RESULT IS NOT FOUND ");}
但是当查询不返回任何内容时,它会因以下错误而终止:
but when the query returns nothing it dies with the following error:
Exception in thread "main" java.lang.NullPointerException
at com.oss.niagaramqtt.MongoLib.exists(MongoLib.java:58)
at com.oss.niagaramqtt.MongoLib.<init>(MongoLib.java:47)
at com.oss.niagaramqtt.startup.main(startup.java:24)
这确实是检查文档存在的总体正确方法吗?
Indeed is this the correct approach overall for checking the existence of a document?
这可能是答案,请确认:
This could be the answer please confirm:
MongoCursor<Document> iterable = collection.find(eq("code", "abcdefg")).projection(Projections.include("_id")).limit(1).iterator();
if (iterable.hasNext()){System.out.println(" RESILT IS FOUND ");}else{System.out.println(" RESULT IS NOT FOUND ");}
推荐答案
如果您需要加载此文档以防它存在,那么您的方法是很好的.如果您不需要加载它,那么您可以使用 MongoCollection.count 方法,如:
Your way is good if you need to load this document in case it exists. If you don't need to load it then you can use MongoCollection.count method like:
long count = collection.count(new BsonDocument("code", new BsonString("abcdefg")));
if (count > 0){System.out.println(" RESILT IS FOUND ");}else{System.out.println(" RESULT IS NOT FOUND ");}
[更新] 如果数据存储在分片集群上,如果存在孤立文档或正在进行块迁移,db.collection.count() 可能会导致计数不准确.所以使用 aggregate
函数更安全:
[Update] In case data is stored on a sharded cluster, db.collection.count() can result in an inaccurate count if orphaned documents exist or if a chunk migration is in progress. So it's safer to use aggregate
function instead:
Iterator<Document> it = collection.aggregate(Arrays.asList(
new Document("$match", new Document("code", "abcdefg")),
new Document("$group", new Document("_id", null).append("count",
new Document("$sum", 1))))).iterator();
int count = it.hasNext() ? (Integer)it.next().get("count") : 0;
参见 http://docs.mongodb.org/manual/reference/sql-aggregation-comparison/ 了解更多详情.
See http://docs.mongodb.org/manual/reference/sql-aggregation-comparison/ for more details.
这篇关于如何使用 mongo Java 驱动程序 3.0+ 检查集合中是否存在文档的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!