对于最新的稳定版本,请使用 Spring Data MongoDB 4.4.0spring-doc.cn

对文档进行计数

模板 API 提供了各种方法来计算与给定条件匹配的文档数量。 其中之一概述如下。spring-doc.cn

template.query(Person.class)
    .matching(query(where("firstname").is("luke")))
    .count();

在 SpringData MongoDB 的 3.x 之前版本中,count 操作使用 MongoDB 的内部集合统计信息。 随着 MongoDB 事务的引入,这不再可能,因为统计数据无法正确反映需要基于聚合的计数方法的事务期间的潜在变化。 因此,在版本 2.x 中,如果没有正在进行的事务,则使用 collection statistics,如果有,则使用 aggregation 变体。MongoOperations.count()spring-doc.cn

从 Spring Data MongoDB 3.x 开始,无论是否存在过滤条件,任何操作都通过 MongoDBs 使用基于聚合的 count 方法。 如果应用程序没有问题,但存在处理集合统计信息的限制,则提供了一种替代方法。countcountDocumentsMongoOperations.estimatedCount()spring-doc.cn

通过设置为 MongoTemplate#count(...) 操作,只要没有活动的事务并且模板未绑定到会话,则使用空过滤器查询的操作将被委托给。 仍然可以通过 获得确切的数字,但可能会加快速度。MongoTemplate#useEstimatedCount(…​)trueestimatedCountMongoTemplate#exactCountspring-doc.cn

MongoDB 的本机方法和聚合不支持,但需要以及 OR 不支持(请参阅 jira.mongodb.org/browse/SERVER-37043)。countDocuments$match$near$nearSphere$geoWithin$center$centerSphere$minDistancespring-doc.cn

因此,对于使用 -/ 的操作,将重写给定的 -/ 以绕过问题,如下所示。QuerycountReactiveMongoTemplatespring-doc.cn

{ location : { $near : [-73.99171, 40.738868], $maxDistance : 1.1 } } (1)
{ location : { $geoWithin : { $center: [ [-73.99171, 40.738868], 1.1] } } } (2)

{ location : { $near : [-73.99171, 40.738868], $minDistance : 0.1, $maxDistance : 1.1 } } (3)
{$and :[ { $nor :[ { location :{ $geoWithin :{ $center :[ [-73.99171, 40.738868 ], 0.01] } } } ]}, { location :{ $geoWithin :{ $center :[ [-73.99171, 40.738868 ], 1.1] } } } ] } (4)
1 使用 对源查询进行计数。$near
2 重写的查询现在使用 with 。$geoWithin$center
3 使用 with 和 对源查询进行计数。$near$minDistance$maxDistance
4 重写的 query 现在是 critierias 的组合,以解决 unsupported 。$nor$geowithin$minDistance