แตกต่างกัน

คำอธิบาย

ค้นหาชุดค่าผสมที่ไม่ซ้ำกันทั้งหมดของค่าสำหรับชุดนิพจน์

ระยะ distinct(...) มีไวยากรณ์คล้ายกับ select(...) เนื่องจากใช้ได้กับนิพจน์ที่เลือกได้ตั้งแต่ 1 รายการขึ้นไป คุณสามารถใช้สตริงได้เมื่อนิพจน์เป็นเพียงการอ้างอิงฟิลด์

ตัวอย่าง

Node.js
let cities = await db.pipeline()
  .collection("cities")
  .distinct("country")
  .execute();

cities = await db.pipeline()
  .collection("cities")
  .distinct(
    field("state").toLower().as("normalizedState"),
    field("country"))
  .execute();

Web

let cities = await execute(db.pipeline()
  .collection("cities")
  .distinct("country"));

cities = await execute(db.pipeline()
  .collection("cities")
  .distinct(
    field("state").toLower().as("normalizedState"),
    field("country")));
Swift
let results = try await db.pipeline()
  .collection("books")
  .distinct([
    Field("author").toUpper().as("author"),
    Field("genre")
  ])
  .execute()

Kotlin

var cities = db.pipeline()
    .collection("cities")
    .distinct("country")
    .execute()

cities = db.pipeline()
    .collection("cities")
    .distinct(
        field("state").toLower().alias("normalizedState"),
        field("country")
    )
    .execute()

Java

Task<Pipeline.Snapshot> cities;
cities = db.pipeline()
        .collection("cities")
        .distinct("country")
        .execute();

cities = db.pipeline()
        .collection("cities")
        .distinct(
                field("state").toLower().alias("normalizedState"),
                field("country"))
        .execute();
Python
from google.cloud.firestore_v1.pipeline_expressions import Field

cities = client.pipeline().collection("cities").distinct("country").execute()

cities = (
    client.pipeline()
    .collection("cities")
    .distinct(Field.of("state").to_lower().as_("normalizedState"), "country")
    .execute()
)
Java
Pipeline.Snapshot cities1 =
    firestore.pipeline().collection("cities").distinct("country").execute().get();

Pipeline.Snapshot cities2 =
    firestore
        .pipeline()
        .collection("cities")
        .distinct(toLower(field("state")).as("normalizedState"), field("country"))
        .execute()
        .get();

พฤติกรรม

ระยะ distinct(...) ทำงานคล้ายกับระยะ aggregate(...) ที่ไม่มีกลุ่ม ดู aggregate(...) และ select(...) ด้วย

ค้นหาค่าฟิลด์ที่ไม่ซ้ำกัน

ตัวอย่างเช่น หากต้องการรับรายการทุกประเทศในคอลเล็กชัน cities ต่อไปนี้

Node.js

await db.collection("cities").doc("SF").set({name: "San Francisco", state: "CA", country: "USA"});
await db.collection("cities").doc("LA").set({name: "Los Angeles", state: "CA", country: "USA"});
await db.collection("cities").doc("NY").set({name: "New York", state: "NY", country: "USA"});
await db.collection("cities").doc("TOR").set({name: "Toronto", state: null, country: "Canada"});
await db.collection("cities").doc("MEX").set({name: "Mexico City", state: null, country: "Mexico"});

คุณสามารถค้นหาประเทศที่ไม่ซ้ำกันได้โดยใช้

Node.js

const cities = await db.pipeline()
  .collection("/cities")
  .distinct("country")
  .execute();

ซึ่งจะสร้างผลลัพธ์ต่อไปนี้

{ country: "USA" }
{ country: "Canada" }
{ country: "Mexico" }

เอาต์พุตที่ไม่ซ้ำกันของนิพจน์

นอกจากนี้ คุณยังค้นหาชุดค่าผสมที่ไม่ซ้ำกันของฟิลด์หลายรายการหรือนิพจน์ที่ซับซ้อนกว่าได้ด้วย เช่น

Node.js

const cities = await db.pipeline()
  .collection("/cities")
  .distinct(
    field("state").toLower().as("normalized_state"),
    field("country"))
  .execute();

เพื่อรับ

{ country: "USA", normalized_state: "ca" }
{ country: "USA", normalized_state: "ny" }
{ country: "Canada", normalized_state: null }
{ country: "Mexico", normalized_state: null }

พฤติกรรมเทียบเท่า

พฤติกรรมเทียบเท่ากับค่าที่ไม่ซ้ำกันเป็นไปตามความหมายเดียวกันกับความเท่ากัน

ซึ่งหมายความว่าค่าที่เทียบเท่ากัน เช่น ค่าตัวเลขที่เทียบเท่ากันทางคณิตศาสตร์ ไม่ว่าจะเป็นประเภทเดิม (จำนวนเต็ม 32 บิต จำนวนเต็ม 64 บิต จำนวนจุดลอยตัว จำนวนทศนิยม ฯลฯ) จะถือว่าเป็นค่าที่ไม่ซ้ำกันค่าเดียวกัน

ตัวอย่างเช่น ในคอลเล็กชัน numerics ที่มีเอกสารต่างๆ ซึ่งมี foo ค่าเป็นจำนวนเต็ม 32 บิต 1 จำนวนเต็ม 64 บิต 1L และจุดลอยตัว 1.0 ตามลำดับ distinct(...) จะแสดงผลลัพธ์เพียง 1 รายการเท่านั้น

ในกรณีที่มีค่าเทียบเท่าต่างๆ อยู่ในชุดข้อมูล ค่าเอาต์พุตของกลุ่มอาจเป็นค่าเทียบเท่าใดก็ได้ ในตัวอย่างนี้ ระบบอาจแสดงค่า foo เป็น 1, 1L หรือ 1.0

แม้ว่าระบบจะดูเหมือนกำหนดได้ คุณก็ไม่ ควรพยายามอาศัยพฤติกรรมของการเลือกค่าใดค่าหนึ่งโดยเฉพาะ

การใช้งานหน่วยความจำ

วิธีดำเนินการระยะ distinct(...) จะขึ้นอยู่กับดัชนีที่มี เมื่อไม่มีดัชนีที่เหมาะสมซึ่งตัวเพิ่มประสิทธิภาพการค้นหาเลือกไว้ distinct(...) จะต้องบัฟเฟอร์ค่าที่ไม่ซ้ำกันทั้งหมดไว้ในหน่วยความจำ

ในกรณีที่มีค่าที่ไม่ซ้ำกันจำนวนมากหรือค่ามีขนาดใหญ่มาก (เช่น ค่าที่ไม่ซ้ำกันที่มีขนาดใหญ่) ระยะนี้อาจใช้หน่วยความจำจนหมด

ในกรณีดังกล่าว คุณควรใช้ตัวกรองเพื่อจำกัดชุดข้อมูลที่จะดำเนินการ distinct(...) หรือสร้างดัชนีตามที่แนะนำเพื่อหลีกเลี่ยงการใช้หน่วยความจำจำนวนมาก

Query Explain จะให้ข้อมูลเกี่ยวกับแผนการดำเนินการค้นหาจริงและข้อมูลการสร้างโปรไฟล์เพื่อช่วยในการแก้ไขข้อบกพร่อง