จัดเรียง

คำอธิบาย

จัดเรียงเอกสารอินพุตตามลำดับการจัดเรียงที่ระบุอย่างน้อย 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();

พฤติกรรม

ลำดับการจัดเรียง

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

ขั้นตอนการจัดเรียงหลายรายการ

เมื่อการค้นหามีขั้นตอนการจัดเรียงที่ต่อเนื่องกันหลายขั้นตอน เฉพาะขั้นตอนการจัดเรียงสุดท้ายเท่านั้นที่จะส่งผลต่อผลลัพธ์การค้นหา โปรดทราบว่าลักษณะการทำงานนี้แตกต่างจากลักษณะการทำงานของคําสั่ง orderBy ใน Core API

การเพิ่มประสิทธิภาพการจัดเรียง Top-N

เมื่อใช้ limit(...) หลังจาก sort ระบบอาจใช้การจัดเรียงแบบ Top-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 }