Cloud Firestore รองรับการใช้ตัวกรองช่วงและอสมการบนช่องหลายช่องในการค้นหาเดียว ตอนนี้คุณมีเงื่อนไขของช่วงและอสมการในหลายช่องได้แล้ว รวมถึงลดความซับซ้อนในการพัฒนาแอปพลิเคชันด้วยการมอบสิทธิ์การใช้งานตรรกะหลังการกรองไปยัง Cloud Firestore
ตัวกรองช่วงและอสมการในหลายฟิลด์
คำค้นหาต่อไปนี้จะแสดงผลผู้ใช้ทั้งหมดที่มีอายุมากกว่า 35 ปีและความสูงระหว่าง 60 ถึง 70 ปีโดยใช้ตัวกรองช่วงสำหรับอายุและความสูง
เวอร์ชันเว็บ 9 แบบแยกส่วน
const q = query(
collection(db, "users"),
where('age', '>', 35),
where('height', '>', 60),
where('height', '<', 70)
);
Swift
let query = db.collection("users")
.whereField("age", isGreaterThan: 35)
.whereField("height", isGreaterThan: 60)
.whereField("height", isLessThan: 70)
Objective-C
FIRQuery *query =
[[[[self.db collectionWithPath:@"users"]
queryWhereField:@"age" isGreaterThan:@35]
queryWhereField:@"height" isGreaterThan:@60]
queryWhereField:@"height" isLessThan:@70];
Java Android
Query query = db.collection("users")
.whereGreaterThan("age", 35)
.whereGreaterThan("height", 60)
.whereLessThan("height", 70);
Kotlin+KTX Android
val query = db.collection("users")
.whereGreaterThan("age", 35)
.whereGreaterThan("height", 60)
.whereLessThan("height", 70)
Java
db.collection("users")
.whereGreaterThan("age", 35)
.whereGreaterThan("height", 60)
.whereLessThan("height", 70);
Node.js
db.collection("users")
.where('age', '>', 35),
.where('height', '>', 60),
.where('height', '<', 70)
ข้อควรพิจารณาเกี่ยวกับการจัดทำดัชนี
ก่อนที่จะเริ่มเรียกใช้การค้นหา โปรดอ่านเกี่ยวกับคำค้นหาและโมเดลข้อมูลของ Cloud Firestore
ใน Cloud Firestore เงื่อนไข ORDER BY
ของการค้นหาจะเป็นตัวกำหนดดัชนีที่ใช้เพื่อแสดงการค้นหาได้ เช่น การค้นหา ORDER BY a ASC, b ASC
ต้องมีดัชนีผสมในช่อง a ASC, b ASC
หากต้องการเพิ่มประสิทธิภาพและต้นทุนของการค้นหา Cloud Firestore คุณควรเพิ่มประสิทธิภาพลำดับช่องในดัชนี คุณควรตรวจสอบว่าดัชนีเรียงลำดับจากซ้ายไปขวาเพื่อให้การค้นหากลั่นไปยังชุดข้อมูลที่ป้องกันการสแกนรายการดัชนีส่วนเกิน
สมมติว่าคุณต้องการค้นหากลุ่มพนักงาน และค้นหาพนักงานที่มีเงินเดือนมากกว่า 100,000 และจำนวนปีของประสบการณ์มากกว่า 0 เมื่อดูจากความเข้าใจเกี่ยวกับชุดข้อมูล คุณจะทราบว่าข้อจำกัดด้านเงินเดือนจะคัดเลือกได้มากกว่าข้อจำกัดด้านประสบการณ์ ดัชนีที่เหมาะสมที่จะลดจำนวนการสแกนดัชนีคือ (salary [...], experience [...])
ดังนั้น คำค้นหาที่เร็วและประหยัดค่าใช้จ่ายจะสั่งซื้อ salary
ก่อนวันที่ experience
และมีลักษณะดังนี้
Java
db.collection("employees")
.whereGreaterThan("salary", 100000)
.whereGreaterThan("experience", 0)
.orderBy("salary")
.orderBy("experience");
Node.js
db.collection("employees")
.where("salary", ">", 100000)
.where("experience", ">", 0)
.orderBy("salary")
.orderBy("experience");
Python
db.collection("employees")
.where("salary", ">", 100000)
.where("experience", ">", 0)
.order_by("salary")
.order_by("experience");
แนวทางปฏิบัติแนะนำในการเพิ่มประสิทธิภาพดัชนี
โปรดคํานึงถึงแนวทางปฏิบัติแนะนําต่อไปนี้เมื่อเพิ่มประสิทธิภาพดัชนี
ฟิลด์ดัชนีลำดับตามค่าเท่ากับตามด้วยช่วงที่เลือกมากที่สุดหรือฟิลด์อสมการ
Cloud Firestore ใช้ช่องด้านซ้ายสุดของดัชนีผสมเพื่อตอบสนองข้อจำกัดความเท่าเทียมและข้อจำกัดเกี่ยวกับช่วงหรืออสมการ (หากมี) ในช่องแรกของการค้นหา orderBy()
ข้อจำกัดเหล่านี้จะลดจำนวนรายการดัชนีที่ Cloud Firestore สแกนได้ Cloud Firestore ใช้ช่องที่เหลือของดัชนีเพื่อตอบสนองข้อจำกัดของช่วงหรือความไม่เสมอภาคอื่นๆ ของการค้นหา ข้อจำกัดเหล่านี้ไม่ลดจำนวนรายการดัชนีที่ Cloud Firestore สแกนแต่กรองเอกสารที่ไม่ตรงกันออก เพื่อให้จำนวนเอกสารที่ส่งคืนไคลเอ็นต์ลดลง
หากต้องการข้อมูลเพิ่มเติมเกี่ยวกับการสร้างดัชนีที่มีประสิทธิภาพ โปรดดูคำจำกัดความของดัชนีที่สมบูรณ์แบบ
ช่องคำสั่งซื้อตามลำดับจากมากไปน้อยของการเลือกข้อจำกัดการค้นหา
โปรดระบุอนุประโยค orderBy()
ที่เรียงลำดับช่องโดยเรียงลำดับจากการจำกัดการค้นหาจากน้อยไปมาก เพื่อให้ Cloud Firestore เลือกดัชนีที่ดีที่สุดสำหรับการค้นหาของคุณ การเลือกที่สูงขึ้นจะตรงกับเอกสารชุดย่อยที่เล็กกว่า ขณะที่การเลือกเฉพาะที่ต่ำกว่าจะจับคู่ชุดเอกสารที่ใหญ่กว่า โปรดตรวจสอบว่าคุณเลือกช่องช่วงหรืออสมการซึ่งมีการเลือกสูงกว่าในการจัดเรียงดัชนีก่อนหน้าช่องที่มีการเลือกต่ำ
หากต้องการลดจำนวนเอกสารที่ Cloud Firestore สแกนและแสดงผลผ่านเครือข่าย คุณควรเรียงลำดับช่องโดยเรียงตามลำดับจากการเลือกที่มีข้อจำกัดการค้นหาเสมอ หากชุดผลลัพธ์ไม่อยู่ในลำดับที่กำหนดและชุดผลลัพธ์ควรมีขนาดเล็ก คุณสามารถใช้ตรรกะฝั่งไคลเอ็นต์เพื่อเรียงลำดับใหม่ตามความคาดหวังในการสั่งซื้อได้
ตัวอย่างเช่น สมมติว่าคุณต้องการค้นหากลุ่มพนักงานเพื่อค้นหาพนักงานที่มีเงินเดือนมากกว่า 100, 000 และเรียงลำดับผลลัพธ์ตามปีที่ทำงานของพนักงาน ถ้าคุณคาดว่าจะมีพนักงานเพียงไม่กี่คนที่มีเงินเดือนมากกว่า 100, 000 คน วิธีเขียนการค้นหาที่มีประสิทธิภาพที่สุดมีดังนี้
Java
db.collection("employees")
.whereGreaterThan("salary", 100000)
.orderBy("salary")
.get()
.addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
// Order results by `experience`
}
});;
Node.js
const querySnapshot = await db.collection('employees')
.where("salary", ">", 100000)
.orderBy("salary")
.get();
// Order results by `experience`
Python
results = db.collection("employees")
.where("salary", ">", 100000)
.order_by("salary")
.stream()
// Order results by `experience`
แม้ว่าการเพิ่มการจัดลำดับที่ experience
ลงในการค้นหาจะแสดงเอกสารชุดเดียวกันและข้ามการจัดลำดับผลลัพธ์ในไคลเอ็นต์ใหม่ แต่การค้นหาอาจอ่านรายการดัชนีที่เกินมามากกว่าการค้นหาก่อนหน้านี้ เนื่องจาก Cloud Firestore มักจะต้องการดัชนีที่มีคำนำหน้าช่องดัชนีตรงกับลำดับตามอนุประโยคของคำค้นหา หากเพิ่ม experience
ลงในการเรียงลำดับตามอนุประโยค Cloud Firestore จะเลือกดัชนี (experience [...], salary [...])
สำหรับผลการค้นหาจากการประมวลผล เนื่องจากไม่มีข้อจำกัดอื่นๆ ใน experience
Cloud Firestore จะอ่านรายการดัชนีทั้งหมดของคอลเล็กชัน employees
ก่อนที่จะใช้ตัวกรอง salary
เพื่อค้นหาชุดผลลัพธ์สุดท้าย ซึ่งหมายความว่าระบบจะยังอ่านรายการดัชนีที่ไม่ตรงกับตัวกรอง salary
อยู่ ซึ่งจะเพิ่มเวลาในการตอบสนองและค่าใช้จ่ายของการค้นหา
ราคา
ระบบจะเรียกเก็บเงินการค้นหาที่มีตัวกรองช่วงและอสมการในหลายฟิลด์ตามรายการที่อ่านเอกสารและดัชนีที่อ่าน
ดูรายละเอียดเพิ่มเติมได้ที่หน้าราคา
ข้อจำกัด
นอกเหนือจากข้อจํากัดของการค้นหาแล้ว โปรดคํานึงถึงข้อจํากัดต่อไปนี้ก่อนใช้คําค้นหาที่มีตัวกรองช่วงและอสมการในหลายช่อง
- ระบบไม่รองรับการค้นหาที่มีตัวกรองช่วงหรืออสมการในช่องเอกสารและมีเพียงข้อจำกัดความเท่าเทียมในคีย์เอกสาร
(__name__)
เท่านั้น - Cloud Firestore จำกัดจำนวนช่องช่วงหรืออสมการเป็น 10 เพื่อป้องกันไม่ให้การค้นหามีราคาแพงเกินไป
ขั้นต่อไปคืออะไร
- ดูข้อมูลเกี่ยวกับการเพิ่มประสิทธิภาพให้คำค้นหา
- ดูข้อมูลเพิ่มเติมเกี่ยวกับการค้นหาแบบง่ายและแบบผสม
- ทำความเข้าใจวิธีที่ Cloud Firestore ใช้ดัชนี