จัดเรียง

คำอธิบาย

จัดเรียงเอกสารอินพุตตามลำดับการจัดเรียงที่ระบุอย่างน้อย 1 รายการ

ตัวอย่าง

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();
Go
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 stage แต่การแสดงผลการจัดเรียงไม่สามารถสร้างการจัดเรียงที่ไม่ซ้ำกันในผลลัพธ์ที่ส่งคืน การจัดเรียงของผลลัพธ์ที่ส่งคืนอาจยังคงแตกต่างกันระหว่างการดำเนินการ

เช่น การจัดเรียงเมืองตาม 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 ฉบับในชุดข้อมูลได้ เนื่องจากเอกสารทั้ง 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 },

จะให้ผลลัพธ์ต่อไปนี้ โดยเอกสาร "โตรอนโต" และเอกสาร "เม็กซิโกซิตี้" จะจัดเรียงเป็น 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 }