การรวมแบบ Native

อธิบายวิธีการเรียกใช้ Bson aggregation stage ของ MongoDB Driver ตั้งแต่ขั้นตอนแรกโดยไม่ต้องใช้ฟังก์ชันใหม่ของ Driver ในการสร้าง DSL ใหม่.


การรวมแบบ Driver-native root

aggregation() จะเรียกใช้ Bson stage ที่ส่งคืนโดย MongoDB Driver ตั้งแต่ขั้นตอนแรกตามลำดับการเรียกใช้ DSL จะไม่ทำการสร้างใหม่ของ Driver aggregation operator แต่จะรับผิดชอบการดำเนินการ 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();

การ mapping ผลลัพธ์

execute()

ทำการ mapping ผลลัพธ์เป็นประเภท entity source.

execute(ResultType.class)

เมื่อรูปแบบผลลัพธ์การรวมไม่ตรงกับเอนทิตีต้นทาง จะทำการแมพไปยังประเภทผลลัพธ์แยกต่างหาก

executeDocument()

คืนค่า Document ของ MongoDB แบบดิบโดยตรง

$score / $scoreFusion ของ MongoDB Driver 5.10

1.0.0 จะไม่สร้าง wrapper เฉพาะสำหรับ $score และ $scoreFusion เนื่องจาก Aggregates.score(...) / Aggregates.scoreFusion(...) ของ Driver 5.10 จะคืนค่า Bson stage อยู่แล้ว จึงส่งต่อไปยัง 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();

เพิ่ม Bson stage หลังจาก Search / Vector

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();

stage(Bson) ของ Search/Vector จะอยู่หลัง $search/$vectorSearch ซึ่งเป็น stage แรกที่จำเป็น $scoreFusion เป็นฟีเจอร์ที่ต้องการให้ stage เองเป็นขั้นตอนแรกใน pipeline ใช้ aggregation()

ตัวเลือกผู้เผยแพร่การรวม

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

preview() และ explain() ของ MongoDB จริงก็รองรับใน root aggregation builder ด้วย