מיון

תיאור

ממיינת את מסמכי הקלט על סמך סדר מיון אחד או יותר שצוין.

דוגמאות

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();
Python
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()
)
Java
Pipeline.Snapshot results =
    firestore
        .pipeline()
        .collection("books")
        .sort(descending(field("release_date")), ascending(field("author")))
        .execute()
        .get();

התנהגות

סדר מיון

סדר המיון הוא לפי סדר סוגי הערכים של 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 },

יכולות להפיק כל פרמוטציה של 3 המסמכים במערך הנתונים, כי לכולם יש את אותו מאפיין 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 },

יכול ליצור כל פרמוטציה של 2 המסמכים במערך הנתונים כי לשני המסמכים יש ערך size שווה ערך 3970000.

שלבי מיון מרובים

אם השאילתה מכילה כמה שלבי מיון רצופים, רק שלב המיון האחרון משפיע על תוצאות השאילתה. חשוב לציין שההתנהגות הזו שונה מההתנהגות של סעיף orderBy בממשק Core API.

אופטימיזציה של מיון Top-N

כשמשתמשים ב-limit(...) אחרי sort, יכול להיות שהמערכת תשתמש במיון של n הפריטים הראשונים. האופטימיזציה הזו מגבילה את השימוש בזיכרון בשלב המיון, ומאפשרת לו לאחסן רק N מסמכים בכל פעם – כפי שמוגדר על ידי limit(...) – וכך המיון יעיל יותר מבחינת השימוש בזיכרון.

ערכים מסוג Null וערכים חסרים

אם שדה שצוין בסדר מסוים לא קיים במסמך, הערך שלו ממוין כאילו הערך הוא 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 },

התוצאות הבאות מתקבלות כשמסמך Toronto ומסמך Mexico City ממוינים כ-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 }