使用mongo中的新3.0+ java driver是检查文档是否存在于集合中的最佳方法。
我看过here并尝试做类似的事情。我只了解到这一点:
FindIterable<Document> iterable = collection.find(eq("code", "abcdefg")).projection(Projections.include("_id")).limit(1);
这将返回一个FindIterable,但是您如何检查它是否找到了任何东西?如果可以,请提供代码示例。
我确实尝试过:
if (!iterable.first().isEmpty()){System.out.println(" RESILT IS FOUND ");}else{System.out.println(" RESULT IS NOT FOUND ");}
但是当查询不返回任何内容时,它将死于以下错误:
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)
确实,这是检查文档是否存在的总体正确方法吗?
编辑:
这可能是答案,请确认:
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方法,例如:
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
函数更安全: 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/。