مرتب کردن

شرح

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

مثال‌ها

Web

const results = await execute(db.pipeline()
  .collection("books")
  .sort(
    field("release_date").descending(), field("author").ascending()
  )
);
Swift
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 به ترتیب اضافه کنید:

Node.js

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 متفاوت است.

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

وقتی limit(...) بعداز sort استفاده می‌شود، ممکن است از مرتب‌سازی 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 }