مرتب سازی

توضیحات

اسناد ورودی را بر اساس یک یا چند ترتیب مرتب‌سازی مشخص‌شده مرتب می‌کند.

مثال‌ها

Web

const results = await execute(db.pipeline()
  .collection("books")
  .sort(
    field("release_date").descending(), field("author").ascending()
  )
);
سویفت
let results = try await db.pipeline()
  .collection("books")
  .sort([
    Field("release_date").descending(), Field("author").ascending()
  ])
  .execute()

Kotlin

val results = db.pipeline()
    .collection("books")
    .sort(
        field("release_date").descending(),
        field("author").ascending()
    )
    .execute()

Java

Task<Pipeline.Snapshot> results = db.pipeline()
    .collection("books")
    .sort(
        field("release_date").descending(),
        field("author").ascending()
    )
    .execute();
پایتون
from google.cloud.firestore_v1.pipeline_expressions import Field

results = (
    client.pipeline()
    .collection("books")
    .sort(Field.of("release_date").descending(), Field.of("author").ascending())
    .execute()
)
جاوا
Pipeline.Snapshot results =
    firestore
        .pipeline()
        .collection("books")
        .sort(descending(field("release_date")), ascending(field("author")))
        .execute()
        .get();
برو
snapshot := client.Pipeline().
	Collection("books").
	Sort(firestore.Orders(
		firestore.Descending(firestore.FieldOf("release_date")),
		firestore.Ascending(firestore.FieldOf("author")),
	)).
	Execute(ctx)

رفتار

ترتیب مرتب‌سازی

ترتیب مرتب‌سازی از ترتیب نوع مقدار Cloud Firestore پیروی می‌کند

ترتیب قطعی نتایج

اگر هیچ مرحله sort در پرس‌وجو وجود نداشته باشد، ترتیب نتایج برگشتی قطعی نیست و ممکن است بین اجراها متفاوت باشد. اگر مرحله sort وجود داشته باشد اما عبارات مرتب‌سازی نتوانند ترتیب منحصر به فردی را در بین نتایج برگشتی ایجاد کنند، ترتیب نتایج برگشتی ممکن است همچنان بین اجراها متفاوت باشد.

برای مثال، مرتب‌سازی شهرها بر اساس country محل قرارگیری شهرها، به ترتیب صعودی در برابر مجموعه داده‌های زیر:

{ name: "Los Angeles", state: "CA", country: "USA", population: 3970000 },
{ name: "New York", state: "NY", country: "USA", population: 8530000 }
{ name: "San Francisco", state: "CA", country: "USA", population: 870000 },

می‌تواند هر جایگشتی از ۳ سند موجود در مجموعه داده‌ها ایجاد کند زیرا همه آنها ویژگی country یکسانی دارند. برای ایجاد یک ترتیب قطعی از نتایج، می‌توانید یک ترتیب مرتب‌سازی بر اساس name به ترتیب اضافه کنید:

نود جی اس

const results = await db.pipeline()
  .collection("/cities")
  .sort(field("country").ascending(), fieldd("__name__").ascending())
  .execute();

این روش از نام منحصر به فرد سند به عنوان عامل تعیین کننده تساوی زمانی که چندین سند دارای مقدار country یکسان هستند، استفاده می‌کند. توجه داشته باشید که هر فیلد دیگری که به همراه فیلد country ، یک کلید منحصر به فرد از سند درون مجموعه را تشکیل می‌دهند، می‌توانند برای ایجاد ترتیب قطعی نتایج استفاده شوند.

مرتب‌سازی مقادیر معادل

مقادیر معادل با هم مرتب شده‌اند، اما ترتیب نتایج در کلاس معادل، طبق بحث «ترتیب قطعی نتایج»، قطعی نیست. برای مثال، مرتب‌سازی شهرها بر اساس size ، به ترتیب صعودی در برابر مجموعه داده‌های زیر:

{ name: "Los Angeles", state: "CA", country: "USA", size: 3970000 },
{ name: "Mexico City", state: null, country: "Mexico", size: 3970000.0 },

می‌تواند هر جایگشتی از دو سند موجود در مجموعه داده‌ها ایجاد کند، زیرا هر دو سند دارای size معادل 3970000 هستند.

مراحل مرتب‌سازی چندگانه

وقتی کوئری شامل چندین مرحله مرتب‌سازی متوالی باشد، فقط آخرین مرحله مرتب‌سازی روی نتایج کوئری تأثیر می‌گذارد. توجه داشته باشید که این با رفتار عبارت orderBy در Core API متفاوت است.

بهینه‌سازی مرتب‌سازی از بالا به N

وقتی از limit(...) بعد از sort استفاده می‌شود، می‌توان از مرتب‌سازی top-n استفاده کرد. این بهینه‌سازی، میزان استفاده از حافظه در مرحله مرتب‌سازی را با اجازه دادن به آن برای ذخیره فقط N سند در یک زمان - همانطور که توسط limit(...) تعریف شده است - محدود می‌کند و مرتب‌سازی را از نظر حافظه کارآمدتر می‌سازد.

مقادیر تهی و غایب

اگر فیلدی که در یک مرتب‌سازی مشخص شده است در سندی وجود نداشته باشد، مقدار آن طوری مرتب می‌شود که انگار مقدار آن null است. برای مثال، مرتب‌سازی شهرها بر اساس state آنها، به ترتیب صعودی در برابر مجموعه داده‌های زیر:

{ name: "Los Angeles", state: "CA", country: "USA", population: 3970000 },
{ name: "Mexico City", state: null, country: "Mexico", population: 9200000 },
{ name: "New York", state: "NY", country: "USA", population: 8530000 }
{ name: "San Francisco", state: "CA", country: "USA", population: 870000 },
{ name: "Toronto", country: "Canada", population: 2930000 },

نتایج زیر را تولید می‌کند که در آن‌ها سند "تورنتو" و سند "مکزیکو سیتی" به صورت null و قبل از سایر اسناد مرتب شده‌اند.

{ name: "Toronto", country: "Canada", population: 2930000 },
{ name: "Mexico City", state: null, country: "Mexico", population: 9200000 },
{ name: "Los Angeles", state: "CA", country: "USA", population: 3970000 },
{ name: "San Francisco", state: "CA", country: "USA", population: 870000 },
{ name: "New York", state: "NY", country: "USA", population: 8530000 }