Cloud Firestore รองรับการใช้ตัวกรองช่วงและตัวกรองความไม่เท่ากันในหลายช่องในการค้นหาเดียว คุณสามารถมีเงื่อนไขช่วงและเงื่อนไขความไม่เท่ากันในหลายฟิลด์ และลดความซับซ้อนในการพัฒนาแอปพลิเคชันโดยมอบหมายการใช้งานตรรกะการกรองภายหลังให้กับ Cloud Firestore
ตัวกรองช่วงและตัวกรองอสมการในหลายช่อง
การค้นหาต่อไปนี้ใช้ตัวกรองช่วงกับประชากรและความหนาแน่นเพื่อแสดงผลเมืองทั้งหมด ที่มีประชากรมากกว่า 1,000,000 คน และความหนาแน่นของประชากร น้อยกว่า 10,000 คนต่อหน่วยพื้นที่
เวอร์ชันเว็บ 9 แบบโมดูล
const q = query(
collection(db, "cities"),
where('population', '>', 1000000),
where('density', '<', 10000),
);
Swift
let query = db.collection("cities")
.whereField("population", isGreaterThan: 1000000)
.whereField("density", isLessThan: 10000)
Objective-C
FIRQuery *query =
[[[[self.db collectionWithPath:@"cities"]
queryWhereField:@"population" isGreaterThan:@1000000]
queryWhereField:@"density" isLessThan:@10000];
Java Android
Query query = db.collection("cities")
.whereGreaterThan("population", 1000000)
.whereLessThan("density", 10000);
Kotlin+KTX Android
val query = db.collection("cities")
.whereGreaterThan("population", 1000000)
.whereLessThan("density", 10000)
Go
query := client.Collection("cities").
Where("population", ">", 1000000).
Where("density", "<", 10000)
Java
db.collection("cities")
.whereGreaterThan("population", 1000000)
.whereLessThan("density", 10000);
Node.js
db.collection("cities")
.where('population', '>', 1000000),
.where('density', '<', 10000)
Python
from google.cloud import firestore
db = firestore.Client()
query = db.collection("cities")
.where("population", ">", 1000000)
.where("density", "<", 10000)
PHP
C#
Ruby
query = cities_ref.where("population", ">", "1000000")
.where("density", "<", 10000)
C++
CollectionReference cities_ref = db->Collection("cities");
Query query = cities_ref.WhereGreaterThan("population", FieldValue::Integer(1000000))
.WhereLessThan("density", FieldValue::Integer(10000));
Unity
CollectionReference citiesRef = db.Collection("cities");
Query query = citiesRef.WhereGreaterThan("population", 1000000)
.WhereLessThan("density", 10000);
Dart
final citiesRef = FirebaseFirestore.instance.collection('cities')
final query = citiesRef.where("population", isGreaterThan: 1000000)
.where("density", isLessThan: 10000);
ข้อควรพิจารณาเกี่ยวกับการจัดทำดัชนี
ก่อนเรียกใช้คําค้นหา โปรดอ่านเกี่ยวกับคําค้นหาและ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สแกน
แต่จะกรองเอกสารที่ไม่ตรงกันออกเพื่อให้จำนวนเอกสารที่
ส่งคืนไปยังไคลเอ็นต์ลดลง
ดูข้อมูลเพิ่มเติมเกี่ยวกับการสร้างดัชนีที่มีประสิทธิภาพได้ที่พร็อพเพอร์ตี้ดัชนี
จัดเรียงฟิลด์ตามลำดับความสามารถในการเลือกข้อจำกัดของคำค้นหาจากมากไปน้อย
เพื่อให้ Cloud Firestore เลือกดัชนีที่เหมาะสมที่สุดสําหรับคําค้นหา ให้
ระบุคําสั่ง orderBy()
ที่จัดเรียงฟิลด์ตามลําดับการลดลงของ
การเลือกข้อจํากัดของคําค้นหา การเลือกที่สูงขึ้นจะตรงกับชุดย่อยของเอกสารที่เล็กลง ในขณะที่การเลือกที่ต่ำลงจะตรงกับชุดย่อยของเอกสารที่ใหญ่ขึ้น ตรวจสอบว่า
คุณเลือกฟิลด์ช่วงหรือฟิลด์ความไม่เท่ากันที่มีการเลือกสูงกว่าในลำดับการจัดทำดัชนี
ก่อนฟิลด์ที่มีการเลือกต่ำกว่า
หากต้องการลดจำนวนเอกสารที่ 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 จะเลือกใช้ดัชนีที่มีคำนำหน้าของฟิลด์ดัชนีตรงกับ
ส่วน ORDER BY ของการค้นหาเสมอ หากมีการเพิ่ม experience
ลงในอนุประโยค ORDER BY
Cloud Firestore จะเลือกดัชนี (experience [...], salary [...])
เพื่อคำนวณผลการค้นหา เนื่องจากไม่มีข้อจำกัดอื่นๆ ใน experience
Cloud Firestore จะอ่านรายการดัชนีทั้งหมดของคอลเล็กชัน employees
ก่อนที่จะใช้ตัวกรอง salary
เพื่อค้นหาชุดผลลัพธ์สุดท้าย ซึ่งหมายความว่าระบบจะยังคงอ่านรายการดัชนีที่ไม่ตรงตามsalary
ตัวกรอง ซึ่งจะเพิ่มเวลาในการตอบสนองและค่าใช้จ่ายของการค้นหา
ราคา
ระบบจะเรียกเก็บเงินสำหรับคำค้นหาที่มีตัวกรองช่วงและตัวกรองความไม่เท่ากันในหลายฟิลด์ตาม เอกสารที่อ่านและรายการดัชนีที่อ่าน
ดูข้อมูลโดยละเอียดได้ที่หน้าราคา
ข้อจำกัด
นอกเหนือจากข้อจำกัดของคำค้นหาแล้ว โปรดทราบข้อจำกัดต่อไปนี้ก่อน ใช้คำค้นหาที่มีตัวกรองช่วงและตัวกรองความไม่เท่ากันในหลายฟิลด์
- ไม่รองรับการค้นหาที่มีตัวกรองช่วงหรือตัวกรองความไม่เท่ากันในช่องเอกสาร และมีข้อจำกัดความเท่ากันเท่านั้นในคีย์เอกสาร
(__name__)
- Cloud Firestore จำกัดจำนวนฟิลด์ช่วงหรือฟิลด์ความไม่เท่ากันเป็น 10 ทั้งนี้เพื่อป้องกันไม่ให้การเรียกใช้คิวรีมีค่าใช้จ่ายสูงเกินไป
ขั้นตอนถัดไป
- ดูข้อมูลเกี่ยวกับการเพิ่มประสิทธิภาพการค้นหา
- ดูข้อมูลเพิ่มเติมเกี่ยวกับการค้นหาแบบง่ายและแบบรวม
- ทําความเข้าใจวิธีที่ Cloud Firestore ใช้ดัชนี