领先一步
VMware 提供培训和认证,以加快您的进步。
了解更多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