Spring Data MongoDB 1.4 M1 的新特性

工程 | Thomas Darimont | 2013 年 12 月 04 日 | ...

作为 Spring Data 发布火车 Codd 的第一个里程碑版本已经发布一段时间了,我想重点介绍一下 MongoDB 模块中附带的一些新特性。

聚合框架中投影的 SpEL 支持

有时,在 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单元测试中找到更多使用示例。

使用 Java 配置进行审计配置

在此版本中,我们攻克了 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。

重新定义 CRUD 方法的行为

CrudRepository 中定义的方法通常由特定于存储的类实现,该类提供所需的行为。但是,您可能希望通过简单的查询执行来覆盖这些方法的执行。现在,您可以使用 @Query 注解标注任何 CRUD 方法来定义应执行的查询表达式。对于基于 MongoDB 的存储库,它看起来如下所示

interface PersonRepository extends MongoRepository<Person, String> {

  @Query("{ 'username' : { $nin : [ 'admin' ] }}")
  List<Person> findAll();
}

此机制适用于所有支持存储库抽象的模块。

支持惰性 DBRefs

到目前为止,绑定到 MongoDB DBRef 的域模型属性是急切加载的,如果您在实体之间存在双向 DBRef 关系,这会导致一些问题。现在,您可以在 @DBRef 注解上设置一个 lazy 属性,以声明一个字段将按需(惰性)解析。当加载文档时,如果检测到此类字段,我们将为给定对象生成一个代理,并在调用对象的任何方法时(除了来自 java.lang.Object 的方法)解析它。

class User{
    
  @DBRef(lazy = true) List<User> fans;
  // …
}

总结

本文简要概述了最新 Codd 版本中的一些新特性,但还有更多内容等待您去探索,您可以在我们的精选更新日志中看到更多信息。

请参阅Spring Data MongoDB 项目页面获取更多信息以及下载、文档等的链接。我们希望用户能够试用此里程碑版本。

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

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

了解更多

获取支持

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

了解更多

即将到来的活动

查看 Spring 社区所有即将到来的活动。

查看全部