This commit introduce an option that allows users to opt in on using estimatedDocumentCount instead of countDocuments in case the used filter query is empty.
To still be able to retrieve the exact number of matching documents we also introduced MongoTemplate#exactCount.
Closes: #3522
Original pull request: #3951.
pull/3912/merge
Christoph Strobl4 years agocommitted byMark Paluch
@ -188,6 +188,8 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
@@ -188,6 +188,8 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
@ -345,6 +347,47 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
@@ -345,6 +347,47 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
@ -1106,6 +1149,17 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
@@ -1106,6 +1149,17 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
@ -1131,10 +1185,29 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
@@ -1131,10 +1185,29 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
.debug(String.format("Executing count: %s in collection: %s",serializeToJsonSafely(filter),collectionName));
@ -3571,5 +3644,15 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
@@ -3571,5 +3644,15 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware,
// native MongoDB objects that offer methods with ClientSession must not be proxied.
@ -190,6 +191,8 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
@@ -190,6 +191,8 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
@ -369,6 +372,49 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
@@ -369,6 +372,49 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
@ -1189,6 +1235,17 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
@@ -1189,6 +1235,17 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
@ -1252,15 +1309,36 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
@@ -1252,15 +1309,36 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
@ -3444,6 +3522,11 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
@@ -3444,6 +3522,11 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
// native MongoDB objects that offer methods with ClientSession must not be proxied.
@ -3521,4 +3604,9 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
@@ -3521,4 +3604,9 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
@ -2289,6 +2289,34 @@ public class MongoTemplateUnitTests extends MongoOperationsUnitTests {
@@ -2289,6 +2289,34 @@ public class MongoTemplateUnitTests extends MongoOperationsUnitTests {
@ -220,7 +220,7 @@ public class ReactiveSessionBoundMongoTemplateUnitTests {
@@ -220,7 +220,7 @@ public class ReactiveSessionBoundMongoTemplateUnitTests {
@ -228,6 +228,15 @@ public class ReactiveSessionBoundMongoTemplateUnitTests {
@@ -228,6 +228,15 @@ public class ReactiveSessionBoundMongoTemplateUnitTests {
@ -2158,6 +2158,12 @@ So in version 2.x `MongoOperations.count()` would use the collection statistics
@@ -2158,6 +2158,12 @@ So in version 2.x `MongoOperations.count()` would use the collection statistics
As of Spring Data MongoDB 3.x any `count` operation uses regardless the existence of filter criteria the aggregation-based count approach via MongoDBs `countDocuments`.
If the application is fine with the limitations of working upon collection statistics `MongoOperations.estimatedCount()` offers an alternative.
[TIP]
====
By setting `MongoTemplate#useEstimatedCount(...)` to `true` _MongoTemplate#count(...)_ operations, that use an empty filter query, will be delegated to `estimatedCount`, as long as there is no transaction active and the template is not bound to a <<mongo.sessions,session>>.
It will still be possible to obtain exact numbers via `MongoTemplate#exactCount`, but may speed up things.
====
[NOTE]
====
MongoDBs native `countDocuments` method and the `$match` aggregation, do not support `$near` and `$nearSphere` but require `$geoWithin` along with `$center` or `$centerSphere` which does not support `$minDistance` (see https://jira.mongodb.org/browse/SERVER-37043).