领先一步
VMware 提供培训和认证,加速您的进步。
了解更多作为 Spring Data 发布火车 Codd 的第一个里程碑版本已经发布一段时间了,我想重点介绍一下 MongoDB 模块中附带的一些新特性。
有时,在 MongoDB 聚合框架的投影中定义算术表达式会相当复杂。
假设订单聚合的一部分是其总价,该价格使用以下公式有效计算:(netPrice * discountRate + fixedCharge) * taxRate
。如果折扣率为 0.8,固定费用为 1.2,税率为 1.19,则使用 MongoDB 聚合框架编码此公式的相应 DBObject
如下所示
{ "aggregate": "product",
"pipeline": [
{ "$project": {
"name": 1,
"netPrice": 1,
"grossPrice": {
"$multiply": [
{ "$add": [ { "$multiply" : [ "$netPrice", 0.8 ] }, 1.2 ] }, 1.19
]
}
}
}
]
}
借助我们对将 SpEL 表达式转换为适当的 MongoDB 投影表达式的新支持,这变得容易得多,因为您可以有效地直接使用原始公式
import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
double discountRate = 0.8;
double fixedCharge = 1.2;
double taxRate = 1.19;
TypedAggregation<Product> agg = newAggregation(Product.class,
project("name", "netPrice")
.andExpression("(netPrice * [0] + [1]) * [2]",
discountRate, fixedCharge, taxRate)
.as("grossPrice")
);
AggregationResults<DBObject> result = mongoTemplate.aggregate(agg, DBObject.class);
List<DBObject> resultList = result.getMappedResults();
在内部,我们将 SpEL 表达式的解析 AST(抽象语法树)转换为适当的 MongoDB 聚合框架表达式。请注意,我们使用数组索引运算符引用了先前声明的变量,该运算符指向可变参数 Object 数组,….andExpression(…)
将其作为第二个参数。您可以在 SpelExpressionTransformer
的单元测试中找到更多使用示例。
在此版本中,我们攻克了 Spring Data 模块中最后一个严格要求 XML 配置的特性 - 审计。如果您想在应用程序中使用审计功能,现在只需使用新的 @EnableMongoAuditing
注解(或 JPA 的等效注解)
@Configuration
@EnableMongoAuditing
@EnableMongoRepositories
class Config {
@Bean
public MongoOperations mongoTemplate() throws Exception {
MongoClient client = new MongoClient();
return new MongoTemplate(new SimpleMongoDbFactory(client, "database"));
}
@Bean
public MongoMappingContext mappingContext() {
return new MongoMappingContext();
}
@Bean
public AuditorAware<BusinessEntity> auditorProvider() {
return new MongoAuditorProvider<BusinessEntity>();
}
}
通过 @EnableMongoAuditing
启用的基础设施将自动获取 ApplicationContext
中可用的 AuditorAware
实例。如果您只想在实体上设置创建和修改日期,则无需声明 AuditorAware
bean。
CrudRepository
中定义的方法通常由特定于存储的类实现,该类提供所需的行为。但是,您可能希望通过简单的查询执行来覆盖这些方法的执行。现在,您可以使用 @Query
注解标注任何 CRUD 方法来定义应执行的查询表达式。对于基于 MongoDB 的存储库,它看起来如下所示
interface PersonRepository extends MongoRepository<Person, String> {
@Query("{ 'username' : { $nin : [ 'admin' ] }}")
List<Person> findAll();
}
此机制适用于所有支持存储库抽象的模块。
到目前为止,绑定到 MongoDB DBRef 的域模型属性是急切加载的,如果您在实体之间存在双向 DBRef 关系,这会导致一些问题。现在,您可以在 @DBRef
注解上设置一个 lazy
属性,以声明一个字段将按需(惰性)解析。当加载文档时,如果检测到此类字段,我们将为给定对象生成一个代理,并在调用对象的任何方法时(除了来自 java.lang.Object
的方法)解析它。
class User{
@DBRef(lazy = true) List<User> fans;
// …
}
本文简要概述了最新 Codd 版本中的一些新特性,但还有更多内容等待您去探索,您可以在我们的精选更新日志中看到更多信息。
请参阅Spring Data MongoDB 项目页面获取更多信息以及下载、文档等的链接。我们希望用户能够试用此里程碑版本。