فريد

الوصف

العثور على جميع المجموعات المختلفة من القيم لسلسلة من التعبيرات

تتضمّن المرحلة distinct(...) بنية مماثلة لعبارة select(...) لأنّها تقبل تعبيرًا واحدًا أو أكثر يمكن تحديده. يمكن استخدام السلاسل عندما يكون التعبير مجرد مرجع حقل:

أمثلة

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 من الأعداد الصحيحة 1 ذات 32 بت والأعداد الصحيحة 1L ذات 64 بت والأعداد العشرية 1.0 على التوالي، لن تعرض distinct(...) سوى نتيجة واحدة.

في مثل هذه الحالات التي تتوفّر فيها قيم مكافئة مختلفة في مجموعة البيانات، يمكن أن تكون قيمة الإخراج للمجموعة أيّ من هذه القيم المكافئة. في هذا المثال، يمكن عرض قيمة foo على أنّها 1 أو 1L أو 1.0.

وحتى إذا بدا أنّها حتمية، لا تحاول الاعتماد على سلوك قيمة معيّنة يتم اختيارها.

استخدام الذاكرة

تعتمد طريقة تنفيذ المرحلة distinct(...) على الفهارس المتاحة. عندما لا يختار محسّن طلب البحث فهرسًا مناسبًا، يتطلّب distinct(...) تخزين جميع القيم المميزة مؤقتًا في الذاكرة.

في حال توفّر عدد كبير جدًا من القيم المميزة أو القيم الكبيرة جدًا (مثل القيم المميزة في القيم الضخمة)، قد تنفد الذاكرة في هذه المرحلة.

في مثل هذه الحالات، عليك تطبيق فلاتر للحدّ من مجموعة البيانات التي سيتم تنفيذ distinct(...) عليها، أو إنشاء فهارس على النحو الموصى به لتجنُّب الاستخدامات الكبيرة للذاكرة.

ستوفّر ميزة &quot;شرح طلب البحث&quot; معلومات حول خطة التنفيذ الفعلية لطلب البحث وبيانات تحديد الملف الشخصي للمساعدة في تصحيح الأخطاء.