Spring Data 2020.0 - Spring Data MongoDB 3.1 的新增功能與重點

工程 | Christoph Strobl | 2020 年 11 月 13 日 | ...

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 Aggregation Framework 周圍的變更和增強功能,它現在允許您指定各種資料聚合操作,甚至包括將 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(...)(先前作用於快取的集合統計資訊)以運行聚合以進行精確計數,這是我們在 Multi Document Transactions 上努力的一部分。現在,在某些情況下,人們可能不需要精確的文件計數,但可以接受足夠接近的近似值。對於這些情況,您現在可以從 MongoOperations.estimatedCount(...) 取得估計值。

最後但並非最不重要的一點,我想提及適用於 Spring Data MongoDB 的正在孵化的 GraalVM native image 支援。請確保已安裝 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

取得 Spring 電子報

隨時關注 Spring 電子報

訂閱

領先一步

VMware 提供培訓和認證,以加速您的進度。

了解更多

取得支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位檔案。

了解更多

即將舉行的活動

查看 Spring 社群中所有即將舉行的活動。

查看全部