统计文档

模板 API 提供各种方法来统计与给定条件匹配的文档数。以下概述其中一种方法。

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

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

从 Spring Data MongoDB 3.x 开始,任何 count 操作都将使用基于聚合的计数方法,通过 MongoDB 的 countDocuments,而不管是否存在筛选条件。如果应用程序可以接受使用集合统计信息的限制,则 MongoOperations.estimatedCount() 提供了一种替代方案。

通过将 MongoTemplate#useEstimatedCount(…​) 设置为 trueMongoTemplate#count(…​) 操作(使用空筛选查询)将委托给 estimatedCount,只要没有活动事务并且模板未绑定到 会话。仍然可以通过 MongoTemplate#exactCount 获得准确的数字,但可能会加快速度。

MongoDB 的原生 countDocuments 方法和 $match 聚合不支持 $near$nearSphere,但需要 $geoWithin 以及 $center$centerSphere,后者不支持 $minDistance(请参阅 jira.mongodb.org/browse/SERVER-37043)。

因此,将使用 Reactive-/MongoTemplatecount 操作重写给定的 Query,以绕过问题,如下所示。

{ 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 现在使用 $geoWithin$center 重写的查询。
3 使用 $near$minDistance$maxDistance 计数源查询。
4 现在重写的查询是 $nor $geowithin 标准的组合,以解决不支持的 $minDistance