แบบสอบถามแบบรวมจะประมวลผลข้อมูลจากรายการดัชนีหลายรายการเพื่อส่งคืนค่าสรุปเดียว
Cloud Firestore รองรับการสืบค้นแบบรวมต่อไปนี้:
-
count()
-
sum()
-
average()
Cloud Firestore คำนวณการรวมกลุ่มและส่งเฉพาะผลลัพธ์กลับไปยังแอปของคุณ เมื่อเปรียบเทียบกับการดำเนินการค้นหาแบบเต็มและคำนวณการรวมกลุ่มในแอปของคุณ การสืบค้นแบบรวมจะประหยัดทั้งการอ่านเอกสารที่เรียกเก็บเงินและไบต์ที่ถ่ายโอน
การสืบค้นแบบรวมจะขึ้นอยู่กับการกำหนดค่าดัชนีที่มีอยู่ซึ่งการสืบค้นของคุณใช้อยู่แล้ว และปรับขนาดตามสัดส่วนตามจำนวนรายการดัชนีที่สแกน เวลาแฝงจะเพิ่มขึ้นตามจำนวนรายการในการรวม
ใช้การรวม count()
แบบสอบถามการรวม count()
ช่วยให้คุณสามารถกำหนดจำนวนเอกสารในคอลเลกชันหรือแบบสอบถามได้
โปรดดูข้อมูลตัวอย่างที่เราตั้งค่าไว้ใน การรับข้อมูล
การรวม count()
ต่อไปนี้จะส่งคืนจำนวนเมืองทั้งหมดในคอลเลกชัน cities
Web modular API
const coll = collection(db, "cities"); const snapshot = await getCountFromServer(coll); console.log('count: ', snapshot.data().count);
สวิฟท์
let query = db.collection("cities") let countQuery = query.count do { let snapshot = try await countQuery.getAggregation(source: .server) print(snapshot.count) } catch { print(error) }
วัตถุประสงค์-C
FIRCollectionReference *query = [self.db collectionWithPath:@"cities"]; [query.count aggregationWithSource:FIRAggregateSourceServer completion:^(FIRAggregateQuerySnapshot *snapshot, NSError *error) { if (error != nil) { NSLog(@"Error fetching count: %@", error); } else { NSLog(@"Cities count: %@", snapshot.count); } }];
Java
Query query = db.collection("cities"); AggregateQuery countQuery = query.count(); countQuery.get(AggregateSource.SERVER).addOnCompleteListener(new OnCompleteListener<AggregateQuerySnapshot>() { @Override public void onComplete(@NonNull Task<AggregateQuerySnapshot> task) { if (task.isSuccessful()) { // Count fetched successfully AggregateQuerySnapshot snapshot = task.getResult(); Log.d(TAG, "Count: " + snapshot.getCount()); } else { Log.d(TAG, "Count failed: ", task.getException()); } } });
Kotlin+KTX
val query = db.collection("cities") val countQuery = query.count() countQuery.get(AggregateSource.SERVER).addOnCompleteListener { task -> if (task.isSuccessful) { // Count fetched successfully val snapshot = task.result Log.d(TAG, "Count: ${snapshot.count}") } else { Log.d(TAG, "Count failed: ", task.getException()) } }
Dart
// Returns number of documents in users collection db.collection("users").count().get().then( (res) => print(res.count), onError: (e) => print("Error completing: $e"), );
ไป
ชวา
CollectionReference collection = db.collection("cities"); AggregateQuerySnapshot snapshot = collection.count().get().get(); System.out.println("Count: " + snapshot.getCount());
โหนด js
const collectionRef = db.collection('cities'); const snapshot = await collectionRef.count().get(); console.log(snapshot.data().count);
หลาม
การรวม count()
จะพิจารณาตัวกรองใดๆ ในแบบสอบถามและส่วนคำสั่ง limit
ใดๆ
Web modular API
const coll = collection(db, "cities"); const q = query(coll, where("state", "==", "CA")); const snapshot = await getCountFromServer(q); console.log('count: ', snapshot.data().count);
สวิฟท์
let query = db.collection("cities").whereField("state", isEqualTo: "CA") let countQuery = query.count do { let snapshot = try await countQuery.getAggregation(source: .server) print(snapshot.count) } catch { print(error) }
วัตถุประสงค์-C
FIRQuery *query = [[self.db collectionWithPath:@"cities"] queryWhereField:@"state" isEqualTo:@"CA"]; [query.count aggregationWithSource:FIRAggregateSourceServer completion:^(FIRAggregateQuerySnapshot *snapshot, NSError *error) { if (error != nil) { NSLog(@"Error fetching count: %@", error); } else { NSLog(@"Cities count: %@", snapshot.count); } }];
Java
Query query = db.collection("cities").whereEqualTo("state", "CA"); AggregateQuery countQuery = query.count(); countQuery.get(AggregateSource.SERVER).addOnCompleteListener(new OnCompleteListener<AggregateQuerySnapshot>() { @Override public void onComplete(@NonNull Task<AggregateQuerySnapshot> task) { if (task.isSuccessful()) { // Count fetched successfully AggregateQuerySnapshot snapshot = task.getResult(); Log.d(TAG, "Count: " + snapshot.getCount()); } else { Log.d(TAG, "Count failed: ", task.getException()); } } });
Kotlin+KTX
val query = db.collection("cities").whereEqualTo("state", "CA") val countQuery = query.count() countQuery.get(AggregateSource.SERVER).addOnCompleteListener { task -> if (task.isSuccessful) { // Count fetched successfully val snapshot = task.result Log.d(TAG, "Count: ${snapshot.count}") } else { Log.d(TAG, "Count failed: ", task.getException()) } }
Dart
// This also works with collectionGroup queries. db.collection("users").where("age", isGreaterThan: 10).count().get().then( (res) => print(res.count), onError: (e) => print("Error completing: $e"), );
ไป
ชวา
CollectionReference collection = db.collection("cities"); Query query = collection.whereEqualTo("state", "CA"); AggregateQuerySnapshot snapshot = query.count().get().get(); System.out.println("Count: " + snapshot.getCount());
โหนด js
const collectionRef = db.collection('cities'); const query = collectionRef.where('state', '==', 'CA'); const snapshot = await query.count().get(); console.log(snapshot.data().count);
หลาม
ใช้การรวม sum()
ใช้การรวม sum()
เพื่อส่งคืนผลรวมของค่าตัวเลขที่ตรงกับข้อความค้นหาที่กำหนด ตัวอย่างเช่น
Web modular API
const coll = collection(firestore, 'cities'); const snapshot = await getAggregateFromServer(coll, { totalPopulation: sum('population') }); console.log('totalPopulation: ', snapshot.data().totalPopulation);
ชวา
collection = db.collection("cities"); snapshot = collection.aggregate(sum("population")).get().get(); System.out.println("Sum: " + snapshot.get(sum("population")));
โหนด js
const coll = firestore.collection('cities'); const sumAggregateQuery = coll.aggregate({ totalPopulation: AggregateField.sum('population'), }); const snapshot = await sumAggregateQuery.get(); console.log('totalPopulation: ', snapshot.data().totalPopulation);
การรวม sum()
จะพิจารณาตัวกรองใดๆ ในแบบสอบถามและส่วนคำสั่งจำกัดใดๆ ตัวอย่างเช่น
Web modular API
const coll = collection(firestore, 'cities'); const q = query(coll, where('capital', '==', true)); const snapshot = await getAggregateFromServer(q, { totalPopulation: sum('population') }); console.log('totalPopulation: ', snapshot.data().totalPopulation);
ชวา
collection = db.collection("cities"); query = collection.whereEqualTo("state", "CA"); snapshot = query.aggregate(sum("population")).get().get(); System.out.println("Sum: " + snapshot.get(sum("population")));
โหนด js
const coll = firestore.collection('cities'); const q = coll.where("capital", "==", true); const sumAggregateQuery = q.aggregate({ totalPopulation: AggregateField.sum('population'), }); const snapshot = await sumAggregateQuery.get(); console.log('totalPopulation: ', snapshot.data().totalPopulation);
ใช้การรวม average()
ใช้การรวม average()
เพื่อส่งคืนค่าเฉลี่ยของค่าตัวเลขที่ตรงกับข้อความค้นหาที่กำหนด ตัวอย่างเช่น
Web modular API
const coll = collection(firestore, 'cities'); const snapshot = await getAggregateFromServer(coll, { averagePopulation: average('population') }); console.log('averagePopulation: ', snapshot.data().averagePopulation);
ชวา
collection = db.collection("cities"); snapshot = collection.aggregate(average("population")).get().get(); System.out.println("Average: " + snapshot.get(average("population")));
โหนด js
const coll = firestore.collection('cities'); const averageAggregateQuery = coll.aggregate({ averagePopulation: AggregateField.average('population'), }); const snapshot = await averageAggregateQuery.get(); console.log('averagePopulation: ', snapshot.data().averagePopulation);
การรวม average()
จะพิจารณาตัวกรองใดๆ ในข้อความค้นหาและส่วนคำสั่งจำกัดใดๆ ตัวอย่างเช่น
Web modular API
const coll = collection(firestore, 'cities'); const q = query(coll, where('capital', '==', true)); const snapshot = await getAggregateFromServer(q, { averagePopulation: average('population') }); console.log('averagePopulation: ', snapshot.data().averagePopulation);
ชวา
collection = db.collection("cities"); query = collection.whereEqualTo("state", "CA"); snapshot = query.aggregate(average("population")).get().get(); System.out.println("Average: " + snapshot.get(average("population")));
โหนด js
const coll = firestore.collection('cities'); const q = coll.where("capital", "==", true); const averageAggregateQuery = q.aggregate({ averagePopulation: AggregateField.average('population'), }); const snapshot = await averageAggregateQuery.get(); console.log('averagePopulation: ', snapshot.data().averagePopulation);
คำนวณการรวมหลายรายการในแบบสอบถาม
คุณสามารถรวมการรวมหลายรายการไว้ในไปป์ไลน์การรวมรายการเดียวได้ ซึ่งสามารถลดจำนวนการอ่านดัชนีที่ต้องการได้ หากแบบสอบถามมีการรวมหลายช่อง แบบสอบถามอาจต้องมีดัชนีผสม ในกรณีนั้น Cloud Firestore จะแนะนำดัชนี
ตัวอย่างต่อไปนี้ดำเนินการรวมหลายรายการในการสืบค้นรวมรายการเดียว:
Web modular API
const coll = collection(firestore, 'cities'); const snapshot = await getAggregateFromServer(coll, { countOfDocs: count(), totalPopulation: sum('population'), averagePopulation: average('population') }); console.log('countOfDocs: ', snapshot.data().countOfDocs); console.log('totalPopulation: ', snapshot.data().totalPopulation); console.log('averagePopulation: ', snapshot.data().averagePopulation);
ชวา
collection = db.collection("cities"); query = collection.whereEqualTo("state", "CA"); AggregateQuery aggregateQuery = query.aggregate(count(), sum("population"), average("population")); snapshot = aggregateQuery.get().get(); System.out.println("Count: " + snapshot.getCount()); System.out.println("Sum: " + snapshot.get(sum("population"))); System.out.println("Average: " + snapshot.get(average("population")));
โหนด js
const coll = firestore.collection('cities'); const aggregateQuery = coll.aggregate({ countOfDocs: AggregateField.count(), totalPopulation: AggregateField.sum('population'), averagePopulation: AggregateField.average('population') }); const snapshot = await aggregateQuery.get(); console.log('countOfDocs: ', snapshot.data().countOfDocs); console.log('totalPopulation: ', snapshot.data().totalPopulation); console.log('averagePopulation: ', snapshot.data().averagePopulation);
การสืบค้นที่มีการรวมหลายรายการจะรวมเฉพาะเอกสารที่มีฟิลด์ทั้งหมดในแต่ละการรวมกลุ่มเท่านั้น ซึ่งอาจนำไปสู่ผลลัพธ์ที่แตกต่างกันจากการดำเนินการแต่ละการรวมกลุ่มแยกกัน
กฎความปลอดภัยสำหรับการสืบค้นแบบรวม
กฎความปลอดภัยของ Cloud Firestore ทำงานเหมือนกันกับคำค้นหาแบบรวมเช่นเดียวกับคำค้นหาที่ส่งคืนเอกสาร กล่าวอีกนัยหนึ่ง หากกฎของคุณอนุญาตให้ไคลเอ็นต์ดำเนินการคอลเลกชันหรือแบบสอบถามกลุ่มคอลเลกชันบางอย่าง ไคลเอ็นต์ก็สามารถดำเนินการรวมแบบสอบถามเหล่านั้นได้เช่นกัน เรียนรู้เพิ่มเติมเกี่ยวกับ วิธีที่กฎความปลอดภัยของ Cloud Firestore โต้ตอบกับคำค้นหา
พฤติกรรมและข้อจำกัด
เมื่อคุณทำงานกับคิวรีแบบรวม ให้สังเกตลักษณะการทำงานและข้อจำกัดต่อไปนี้:
คุณไม่สามารถใช้แบบสอบถามแบบรวมกับผู้ฟังแบบเรียลไทม์และแบบสอบถามแบบออฟไลน์ได้ การสืบค้นแบบรวมได้รับการสนับสนุนผ่านการตอบกลับของเซิร์ฟเวอร์โดยตรงเท่านั้น การสืบค้นจะให้บริการโดยแบ็กเอนด์ Cloud Firestore เท่านั้น โดยข้ามแคชในเครื่องและการอัปเดตที่บัฟเฟอร์ใดๆ ลักษณะการทำงานนี้เหมือนกับการดำเนินการที่ทำภายใน ธุรกรรม Cloud Firestore
หากการรวมไม่สามารถแก้ไขได้ภายใน 60 วินาที จะส่งคืนข้อผิดพลาด
DEADLINE_EXCEEDED
ประสิทธิภาพขึ้นอยู่กับการกำหนดค่าดัชนีของคุณและขนาดของชุดข้อมูลหากการดำเนินการไม่เสร็จสมบูรณ์ภายในกำหนดเวลา 60 วินาที วิธีแก้ไขที่เป็นไปได้คือการใช้ ตัวนับ สำหรับชุดข้อมูลขนาดใหญ่
แบบสอบถามการรวมอ่านจากรายการดัชนีและรวมเฉพาะฟิลด์ที่จัดทำดัชนีเท่านั้น
การเพิ่มส่วนคำ
OrderBy
ลงในแบบสอบถามการรวมจะจำกัดการรวมกลุ่มในเอกสารที่มีฟิลด์การเรียงลำดับอยู่สำหรับการรวมผล
sum()
และaverage()
ค่าที่ไม่ใช่ตัวเลขจะถูกละเว้น การรวมsum()
และaverage()
จะพิจารณาเฉพาะค่าจำนวนเต็มและค่าตัวเลขทศนิยมเท่านั้นเมื่อรวมการรวมหลายรายการไว้ในแบบสอบถามเดียว โปรดทราบว่า
sum()
และaverage()
ละเว้นค่าที่ไม่ใช่ตัวเลข ในขณะที่count()
รวมค่าที่ไม่ใช่ตัวเลขหากคุณรวมการรวมข้อมูลที่อยู่ในฟิลด์ที่แตกต่างกัน การคำนวณจะรวมเฉพาะเอกสารที่มีฟิลด์เหล่านั้นทั้งหมด
ราคา
ราคาสำหรับการสืบค้นแบบรวมขึ้นอยู่กับจำนวนรายการดัชนีที่ตรงกับการสืบค้น คุณจะถูกเรียกเก็บเงินสำหรับการอ่านจำนวนเล็กน้อยสำหรับรายการที่ตรงกันจำนวนมาก
ดู ข้อมูลราคา โดยละเอียดเพิ่มเติม