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