Spring Data 2020.0 - Spring Data MongoDB 3.1 中的新增功能

工程 | Christoph Strobl | 2020年11月13日 | ...

Spring Data MongoDB 3.1 版本是从 Spring Data Commons 模块的最新更改中受益匪浅的模块之一,它利用了在那里构建的基础设施来带来响应式功能,如审计和 SpEL。 以下代码段让您了解这对于使用 SpEL 的声明式 MongoDB 查询意味着什么

@Query("{ 'supervisor' : ?#{ hasRole('ROLE_ADMIN') " +
  "? new Document('$regex', '*') : principal.name } }")
Flux<Person> findAllFilteredByRole();

@EnableReactiveMongoAuditing 使用公共基础设施,因此您可以轻松跟踪更改。

@Configuration
@EnableReactiveMongoAuditing
static class AuditingConfig extends AbstractReactiveMongoConfiguration {
   
  @Override
  protected String getDatabaseName() {
    return "database";
  }
    
  @Bean
  public ReactiveAuditorAware<User> auditorProvider() {
      return () -> ReactiveSecurityContextHolder.getContext()
        .map(it -> ...);
  }
}

当前版本的另一个重点是跟上 MongoDB Aggregation Framework 周围的变化和增强,现在可以让您指定各种数据聚合操作,甚至包括将 JavaScript 函数作为管道的一部分运行的可能性(如示例所示),从 MongoDB 参考文档中重新创建平均图书计算,如下所示

Accumulator accumulator = accumulatorBuilder()
  .init("function() { return { count: 0, sum: 0 } }")
  .accumulate("function(state, numCopies) { return { count: state.count + 1, sum: state.sum + numCopies } }")
  .accumulateArgs("$copies")
  .merge("function(state1, state2) { return { count: state1.count + state2.count, sum: state1.sum + state2.sum } }")
  .finalize("function(state) { return (state.sum / state.count) }");

为了提高对大型数据集进行聚合的性能,MongoDB 允许您使用 AggregationOptions.builder().hint("…") 将索引提示添加到管道。

说到索引,虽然我们强烈建议您对索引创建进行编程控制,但我们也理解声明式索引定义的便利性。 因此,我们将部分过滤器表达式添加到 @Indexed@CompoundIndex 注释中,以使索引设置更加方便,如下所示

@CompoundIndex(name = "idx", def = "...", 
  partialFilter = "{'ssn': {'$exists': true}}")
public class Person {
	
  //...
  @Indexed(partialFilter = "{'rating': { $lt: 10 }}") 
  String lastname;
}

现在我们已经加快了聚合和索引的速度,是时候讨论计数元素了。 如您所知,我们切换了 MongoOperations.count(...)(以前在缓存的集合统计信息上工作)以运行聚合以进行精确计数,作为我们在 多文档事务方面的工作的一部分。 现在,在某些情况下,可能不需要精确的文档计数,但可以使用足够接近的近似值。 对于这些情况,您现在可以从 MongoOperations.estimatedCount(...) 获得估计值。

最后但并非最不重要的一点,我想提及 Spring Data MongoDB 对 GraalVM native image 的孵化支持。 确保已安装 Docker(仅为了方便起见,因为这将使您无需安装 GraalVM 和 MongoDB),并查看演示您的 经典响应式 MongoDB 应用程序的即时启动的示例。

$ git clone https://github.com/spring-projects-experimental/spring-graalvm-native.git
$ cd spring-graalvm-native
$ git checkout 0.8.2
$ ./run-dev-container.sh
...@docker: cd spring-graalvm-native-samples/data-mongo
...@docker: ./build.sh
...@docker: ./target/data-mongodb

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,以加速您的进步。

了解更多

获得支持

Tanzu Spring 在一个简单的订阅中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部