diff --git a/commons-datastore/commons-datastore-mongodb/src/main/java/org/opencb/commons/datastore/mongodb/MongoDBCollection.java b/commons-datastore/commons-datastore-mongodb/src/main/java/org/opencb/commons/datastore/mongodb/MongoDBCollection.java index e6792c6d..c407d1c7 100644 --- a/commons-datastore/commons-datastore-mongodb/src/main/java/org/opencb/commons/datastore/mongodb/MongoDBCollection.java +++ b/commons-datastore/commons-datastore-mongodb/src/main/java/org/opencb/commons/datastore/mongodb/MongoDBCollection.java @@ -131,6 +131,12 @@ public DataResult count(ClientSession clientSession, Bson query) { return endQuery(Collections.emptyList(), l, start); } + public DataResult estimatedCount() { + long start = startQuery(); + long l = mongoDBNativeQuery.estimatedCount(); + return endQuery(Collections.emptyList(), l, start); + } + public DataResult distinct(String key, Bson query) { long start = startQuery(); List l = new ArrayList<>(); diff --git a/commons-datastore/commons-datastore-mongodb/src/main/java/org/opencb/commons/datastore/mongodb/MongoDBNativeQuery.java b/commons-datastore/commons-datastore-mongodb/src/main/java/org/opencb/commons/datastore/mongodb/MongoDBNativeQuery.java index c7b33b62..38f7b65b 100644 --- a/commons-datastore/commons-datastore-mongodb/src/main/java/org/opencb/commons/datastore/mongodb/MongoDBNativeQuery.java +++ b/commons-datastore/commons-datastore-mongodb/src/main/java/org/opencb/commons/datastore/mongodb/MongoDBNativeQuery.java @@ -64,6 +64,10 @@ public long count(ClientSession clientSession, Bson query) { } } + public long estimatedCount() { + return dbCollection.estimatedDocumentCount(); + } + public DistinctIterable distinct(String key) { return distinct(key, null, Document.class); } @@ -235,7 +239,11 @@ public MongoDBIterator find(ClientSession clientSession, Bson query, Bson Future countFuture = null; if (options != null && options.getBoolean(QueryOptions.COUNT)) { ExecutorService executor = Executors.newSingleThreadExecutor(); - countFuture = executor.submit(() -> count(clientSession, query)); + if (clientSession == null && (query == null || query.equals(Filters.empty()) || query.toBsonDocument().isEmpty())) { + countFuture = executor.submit(this::estimatedCount); + } else { + countFuture = executor.submit(() -> count(clientSession, query)); + } } FindIterable findIterable = null; diff --git a/commons-datastore/commons-datastore-mongodb/src/test/java/org/opencb/commons/datastore/mongodb/MongoDBCollectionTest.java b/commons-datastore/commons-datastore-mongodb/src/test/java/org/opencb/commons/datastore/mongodb/MongoDBCollectionTest.java index 21bade4a..de6a06af 100644 --- a/commons-datastore/commons-datastore-mongodb/src/test/java/org/opencb/commons/datastore/mongodb/MongoDBCollectionTest.java +++ b/commons-datastore/commons-datastore-mongodb/src/test/java/org/opencb/commons/datastore/mongodb/MongoDBCollectionTest.java @@ -298,6 +298,12 @@ public void testCount1() throws Exception { assertEquals("The number must be equals", N, queryResult.getNumMatches()); } + @Test + public void testEstimatedCount() { + DataResult queryResult = mongoDBCollection.estimatedCount(); + assertEquals("The number of documents must be equals", N, queryResult.getNumMatches()); + } + @Test public void testDistinct1() throws Exception { DataResult queryResult = mongoDBCollection.distinct("age", null, Integer.class);