Spring Data MongoDB 1.4 M1 新特性

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

作为 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 聚合框架表达式。请注意,我们通过使用数组索引运算符来引用先前声明的变量,该运算符引用 varargs 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();
}

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

对延迟 DBRef 的支持

到目前为止,绑定到 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 社区中所有即将举行的活动。

查看全部