原生聚合

說明如何從第一階段開始直接執行 MongoDB Driver 的 Bson 聚合階段,並在不重新實現 DSL 功能的情況下使用新 Driver 功能。


Driver-native 根聚合

aggregation() 會按照 MongoDB Driver 返回的 Bson 階段的調用順序從第一階段開始執行。DSL 不重新實現 Driver 聚合運算符,只負責 pipeline 執行、mapping、Reactor publisher、preview/explain 連接。Document 也是 Bson,因此可以直接傳遞。

java
Flux<User> result = dsl
    .executeEntity(User.class, MongoTemplateName.FRONT)
    .aggregation()
    .stage(Aggregates.match(Filters.eq("status", "ACTIVE")))
    .stage(Aggregates.sort(Sorts.descending("createdAt")))
    .stage(Aggregates.limit(20))
    .execute();

結果映射

execute()

將結果映射為 source entity 類型。

執行(ResultType.class)

當聚合結果形狀與來源實體不一致時,映射到單獨的結果類型。

執行文件()

直接返回原始 MongoDB Document。

MongoDB Driver 5.10 的 $score / $scoreFusion

1.0.0 不會創建 $score 和 $scoreFusion 專用的包裝器。Driver 5.10 的 Aggregates.score(...) / Aggregates.scoreFusion(...) 已經返回 Bson 階段,因此直接傳遞給 stage(...)。

java
.aggregation()
.stage(Aggregates.score("$rating"))
.executeDocument();
java
Bson searchStage = Aggregates.search(
    SearchOperator.text(SearchPath.fieldPath("title"), "mongodb"),
    SearchOptions.searchOptions().index("search-index")
);

Bson vectorStage = Aggregates.vectorSearch(
    SearchPath.fieldPath("embedding"),
    List.of(0.1D, 0.2D, 0.3D),
    "vector-index",
    10L,
    VectorSearchOptions.exactVectorSearchOptions()
);

Flux<Document> result = dsl
    .executeEntity(User.class, MongoTemplateName.FRONT)
    .aggregation()
    .stage(
        Aggregates.scoreFusion(
            List.of(
                FusionPipeline.of("text", searchStage),
                FusionPipeline.of("vector", vectorStage)
            ),
            ScoreNormalization.SIGMOID
        )
    )
    .executeDocument();

在 Search / Vector 後添加 Bson 階段

java
.search("search-index")
.text(text -> text.path("title").query("mongodb"))
.stage(Aggregates.score("$rating"))
.findAll()
.execute();

.vectorSearch("vector-index")
.path("embedding")
.queryVector(vector)
.limit(20)
.exact()
.stage(Aggregates.score("$rating"))
.findAll()
.execute();

Search/Vector 的 stage(Bson) 在強制性的第一階段 $search / $vectorSearch 之後進行。像 $scoreFusion 這樣的功能必須是管道的第一個階段,使用 aggregation()。

聚合發佈者選項

java
.aggregation()
.readPreference(ReadPreference.secondaryPreferred())
.isAllowDiskUse(true)
.customizeAggregation(publisher -> publisher.batchSize(500))

preview() 和實際的 MongoDB explain() 也在根聚合構建器中得到支持。

© 2026 Byeolnaerim. 版權所有。介紹隱私政策