领先一步
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 聚合框架表达式。请注意,我们通过使用数组索引运算符来引用先前声明的变量,该运算符引用 varargs 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 项目页面,以获取更多信息以及下载、文档等的链接。我们感谢用户试用此里程碑版本。