فريد

الوصف

يمكنك الاطّلاع على القيم المميزة لحقل أو تعبير من المراحل السابقة.

البنية

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

Node.js

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

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

أمثلة على العملاء

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 select في إزالة التكرار، وبالتالي يمكن استخدام أي تعبير قابل للتحديد متاح لـ select مع distinct أيضًا.

تعمل مرحلة distinct بشكل مشابه لمرحلة التجميع بدون مجموعات.

اطّلِع أيضًا على مرحلة التجميع ومرحلة الاختيار.

البحث عن قيم حقول مميزة

على سبيل المثال، للحصول على قائمة بكل بلد في المجموعة التالية 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; معلومات حول خطة التنفيذ الفعلية للاستعلام وبيانات تحديد الملف الشخصي للمساعدة في تصحيح الأخطاء.