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 聚合框架的更改和增强,它允许您指定各种数据聚合操作,甚至包括在管道中运行 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 原生镜像 支持。请确保已安装 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 社区中所有即将举行的活动。

查看全部