باستخدام مؤشرات الاستعلام في Cloud Firestore، يمكنك تقسيم البيانات التي يتم إرجاعها بواسطة الاستعلام إلى دفعات وفقًا للمعلمات التي تحددها في استعلامك.
تحدد مؤشرات الاستعلام نقطتي البداية والنهاية للاستعلام، مما يسمح لك بما يلي:
- إرجاع مجموعة فرعية من البيانات.
- نتائج الاستعلام ترقيم الصفحات.
ومع ذلك، لتحديد نطاق معين لاستعلام، يجب عليك استخدام طريقة where()
الموضحة في الاستعلامات البسيطة .
إضافة مؤشر بسيط إلى استعلام
استخدم أساليب startAt()
أو startAfter()
لتحديد نقطة البداية للاستعلام. تتضمن طريقة startAt()
نقطة البداية، بينما تستثنيها طريقة startAfter()
.
على سبيل المثال، إذا كنت تستخدم startAt(A)
في استعلام، فسيتم إرجاع الأبجدية بأكملها. إذا استخدمت startAfter(A)
بدلاً من ذلك، فستُرجع BZ
.
Web modular API
import { query, orderBy, startAt } from "firebase/firestore"; const q = query(citiesRef, orderBy("population"), startAt(1000000));
Web namespaced API
citiesRef.orderBy("population").startAt(1000000);
سويفت
// Get all cities with population over one million, ordered by population. db.collection("cities") .order(by: "population") .start(at: [1000000])
ج موضوعية
// Get all cities with population over one million, ordered by population. [[[db collectionWithPath:@"cities"] queryOrderedByField:@"population"] queryStartingAtValues:@[ @1000000 ]];
Kotlin+KTX
// Get all cities with a population >= 1,000,000, ordered by population, db.collection("cities") .orderBy("population") .startAt(1000000)
Java
// Get all cities with a population >= 1,000,000, ordered by population, db.collection("cities") .orderBy("population") .startAt(1000000);
Dart
db.collection("cities").orderBy("population").startAt([1000000]);
جافا
بايثون
Python
سي ++
// Get all cities with a population >= 1,000,000, ordered by population, db->Collection("cities") .OrderBy("population") .StartAt({FieldValue::Integer(1000000)});
Node.js
يذهب
بي أتش بي
بي أتش بي
لمعرفة المزيد حول تثبيت وإنشاء عميل Cloud Firestore، راجع مكتبات عميل Cloud Firestore .
وحدة
Query query = citiesRef.OrderBy("Population").StartAt(1000000);
ج #
روبي
وبالمثل، استخدم أساليب endAt()
أو endBefore()
لتحديد نقطة نهاية لنتائج الاستعلام الخاص بك.
Web modular API
import { query, orderBy, endAt } from "firebase/firestore"; const q = query(citiesRef, orderBy("population"), endAt(1000000));
Web namespaced API
citiesRef.orderBy("population").endAt(1000000);
سويفت
// Get all cities with population less than one million, ordered by population. db.collection("cities") .order(by: "population") .end(at: [1000000])
ج موضوعية
// Get all cities with population less than one million, ordered by population. [[[db collectionWithPath:@"cities"] queryOrderedByField:@"population"] queryEndingAtValues:@[ @1000000 ]];
Kotlin+KTX
// Get all cities with a population <= 1,000,000, ordered by population, db.collection("cities") .orderBy("population") .endAt(1000000)
Java
// Get all cities with a population <= 1,000,000, ordered by population, db.collection("cities") .orderBy("population") .endAt(1000000);
Dart
db.collection("cities").orderBy("population").endAt([1000000]);
جافا
بايثون
Python
سي ++
// Get all cities with a population <= 1,000,000, ordered by population, db->Collection("cities") .OrderBy("population") .EndAt({FieldValue::Integer(1000000)});
Node.js
يذهب
بي أتش بي
بي أتش بي
لمعرفة المزيد حول تثبيت وإنشاء عميل Cloud Firestore، راجع مكتبات عميل Cloud Firestore .
وحدة
Query query = citiesRef.OrderBy("Population").EndAt(1000000);
ج #
روبي
استخدم لقطة مستند لتحديد مؤشر الاستعلام
يمكنك أيضًا تمرير لقطة مستند إلى عبارة المؤشر كنقطة بداية أو نهاية لمؤشر الاستعلام. تعمل القيم الموجودة في لقطة المستند كقيم في مؤشر الاستعلام.
على سبيل المثال، قم بالتقاط لقطة من مستند "سان فرانسيسكو" في مجموعة البيانات الخاصة بالمدن والسكان. بعد ذلك، استخدم لقطة المستند هذه كنقطة بداية لمؤشر الاستعلام السكاني الخاص بك. سيعرض استعلامك كافة المدن التي يزيد عدد سكانها عن مدينة سان فرانسيسكو أو يساويها، كما هو محدد في لقطة المستند.
Web modular API
import { collection, doc, getDoc, query, orderBy, startAt } from "firebase/firestore"; const citiesRef = collection(db, "cities"); const docSnap = await getDoc(doc(citiesRef, "SF")); // Get all cities with a population bigger than San Francisco const biggerThanSf = query(citiesRef, orderBy("population"), startAt(docSnap)); // ...
Web namespaced API
var citiesRef = db.collection("cities"); return citiesRef.doc("SF").get().then((doc) => { // Get all cities with a population bigger than San Francisco var biggerThanSf = citiesRef .orderBy("population") .startAt(doc); // ... });
سويفت
db.collection("cities") .document("SF") .addSnapshotListener { (document, error) in guard let document = document else { print("Error retreving cities: \(error.debugDescription)") return } // Get all cities with a population greater than or equal to San Francisco. let sfSizeOrBigger = db.collection("cities") .order(by: "population") .start(atDocument: document) }
ج موضوعية
[[[db collectionWithPath:@"cities"] documentWithPath:@"SF"] addSnapshotListener:^(FIRDocumentSnapshot *snapshot, NSError *error) { if (snapshot == nil) { NSLog(@"Error retreiving cities: %@", error); return; } // Get all cities with a population greater than or equal to San Francisco. FIRQuery *sfSizeOrBigger = [[[db collectionWithPath:@"cities"] queryOrderedByField:@"population"] queryStartingAtDocument:snapshot]; }];
Kotlin+KTX
// Get the data for "San Francisco" db.collection("cities").document("SF") .get() .addOnSuccessListener { documentSnapshot -> // Get all cities with a population bigger than San Francisco. val biggerThanSf = db.collection("cities") .orderBy("population") .startAt(documentSnapshot) // ... }
Java
// Get the data for "San Francisco" db.collection("cities").document("SF") .get() .addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() { @Override public void onSuccess(DocumentSnapshot documentSnapshot) { // Get all cities with a population bigger than San Francisco. Query biggerThanSf = db.collection("cities") .orderBy("population") .startAt(documentSnapshot); // ... } });
Dart
db.collection("cities").doc("SF").get().then( (documentSnapshot) { final biggerThanSf = db .collection("cities") .orderBy("population") .startAt([documentSnapshot]); }, onError: (e) => print("Error: $e"), );
جافا
بايثون
Python
سي ++
db->Collection("cities").Document("SF").Get().OnCompletion( [db](const Future<DocumentSnapshot>& future) { if (future.error() == Error::kErrorOk) { const DocumentSnapshot& document_snapshot = *future.result(); Query bigger_than_sf = db->Collection("cities") .OrderBy("population") .StartAt({document_snapshot}); // ... } });
Node.js
يذهب
بي أتش بي
بي أتش بي
لمعرفة المزيد حول تثبيت وإنشاء عميل Cloud Firestore، راجع مكتبات عميل Cloud Firestore .
وحدة
CollectionReference citiesRef = db.Collection("cities"); DocumentReference docRef = citiesRef.Document("SF"); docRef.GetSnapshotAsync().ContinueWith((snapshotTask) => { Query query = citiesRef.OrderBy("Population").StartAt(snapshotTask.Result); });
ج #
روبي
ترقيم صفحات الاستعلام
ترقيم صفحات الاستعلامات من خلال دمج مؤشرات الاستعلام مع الأسلوب limit()
. على سبيل المثال، استخدم المستند الأخير في الدفعة كبداية لمؤشر الدفعة التالية.
Web modular API
import { collection, query, orderBy, startAfter, limit, getDocs } from "firebase/firestore"; // Query the first page of docs const first = query(collection(db, "cities"), orderBy("population"), limit(25)); const documentSnapshots = await getDocs(first); // Get the last visible document const lastVisible = documentSnapshots.docs[documentSnapshots.docs.length-1]; console.log("last", lastVisible); // Construct a new query starting at this document, // get the next 25 cities. const next = query(collection(db, "cities"), orderBy("population"), startAfter(lastVisible), limit(25));
Web namespaced API
var first = db.collection("cities") .orderBy("population") .limit(25); return first.get().then((documentSnapshots) => { // Get the last visible document var lastVisible = documentSnapshots.docs[documentSnapshots.docs.length-1]; console.log("last", lastVisible); // Construct a new query starting at this document, // get the next 25 cities. var next = db.collection("cities") .orderBy("population") .startAfter(lastVisible) .limit(25); });
سويفت
// Construct query for first 25 cities, ordered by population let first = db.collection("cities") .order(by: "population") .limit(to: 25) first.addSnapshotListener { (snapshot, error) in guard let snapshot = snapshot else { print("Error retreving cities: \(error.debugDescription)") return } guard let lastSnapshot = snapshot.documents.last else { // The collection is empty. return } // Construct a new query starting after this document, // retrieving the next 25 cities. let next = db.collection("cities") .order(by: "population") .start(afterDocument: lastSnapshot) // Use the query for pagination. // ... }
ج موضوعية
FIRQuery *first = [[[db collectionWithPath:@"cities"] queryOrderedByField:@"population"] queryLimitedTo:25]; [first addSnapshotListener:^(FIRQuerySnapshot *snapshot, NSError *error) { if (snapshot == nil) { NSLog(@"Error retreiving cities: %@", error); return; } if (snapshot.documents.count == 0) { return; } FIRDocumentSnapshot *lastSnapshot = snapshot.documents.lastObject; // Construct a new query starting after this document, // retreiving the next 25 cities. FIRQuery *next = [[[db collectionWithPath:@"cities"] queryOrderedByField:@"population"] queryStartingAfterDocument:lastSnapshot]; // Use the query for pagination. // ... }];
Kotlin+KTX
// Construct query for first 25 cities, ordered by population val first = db.collection("cities") .orderBy("population") .limit(25) first.get() .addOnSuccessListener { documentSnapshots -> // ... // Get the last visible document val lastVisible = documentSnapshots.documents[documentSnapshots.size() - 1] // Construct a new query starting at this document, // get the next 25 cities. val next = db.collection("cities") .orderBy("population") .startAfter(lastVisible) .limit(25) // Use the query for pagination // ... }
Java
// Construct query for first 25 cities, ordered by population Query first = db.collection("cities") .orderBy("population") .limit(25); first.get() .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() { @Override public void onSuccess(QuerySnapshot documentSnapshots) { // ... // Get the last visible document DocumentSnapshot lastVisible = documentSnapshots.getDocuments() .get(documentSnapshots.size() -1); // Construct a new query starting at this document, // get the next 25 cities. Query next = db.collection("cities") .orderBy("population") .startAfter(lastVisible) .limit(25); // Use the query for pagination // ... } });
Dart
// Construct query for first 25 cities, ordered by population final first = db.collection("cities").orderBy("population").limit(25); first.get().then( (documentSnapshots) { // Get the last visible document final lastVisible = documentSnapshots.docs[documentSnapshots.size - 1]; // Construct a new query starting at this document, // get the next 25 cities. final next = db .collection("cities") .orderBy("population") .startAfter([lastVisible]).limit(25); // Use the query for pagination // ... }, onError: (e) => print("Error completing: $e"), );
جافا
بايثون
Python
سي ++
// Construct query for first 25 cities, ordered by population Query first = db->Collection("cities").OrderBy("population").Limit(25); first.Get().OnCompletion([db](const Future<QuerySnapshot>& future) { if (future.error() != Error::kErrorOk) { // Handle error... return; } // Get the last visible document const QuerySnapshot& document_snapshots = *future.result(); std::vector<DocumentSnapshot> documents = document_snapshots.documents(); const DocumentSnapshot& last_visible = documents.back(); // Construct a new query starting at this document, // get the next 25 cities. Query next = db->Collection("cities") .OrderBy("population") .StartAfter(last_visible) .Limit(25); // Use the query for pagination // ... });
Node.js
يذهب
بي أتش بي
بي أتش بي
لمعرفة المزيد حول تثبيت وإنشاء عميل Cloud Firestore، راجع مكتبات عميل Cloud Firestore .
وحدة
CollectionReference citiesRef = db.Collection("cities"); Query firstQuery = citiesRef.OrderBy("Population").Limit(3); // Get the last document from the results firstQuery.GetSnapshotAsync().ContinueWith((querySnapshotTask) => { long lastPopulation = 0; foreach (DocumentSnapshot documentSnapshot in querySnapshotTask.Result.Documents) { lastPopulation = documentSnapshot.GetValue<long>("Population"); } // Construct a new query starting at this document. // Note: this will not have the desired effect if multiple cities have the exact same population value Query secondQuery = citiesRef.OrderBy("Population").StartAfter(lastPopulation); Task<QuerySnapshot> secondQuerySnapshot = secondQuery.GetSnapshotAsync();
ج #
روبي
قم بتعيين المؤشر بناءً على حقول متعددة
عند استخدام المؤشر استنادًا إلى قيمة حقل (وليس DocumentSnapshot)، يمكنك جعل موضع المؤشر أكثر دقة عن طريق إضافة حقول إضافية. يعد هذا مفيدًا بشكل خاص إذا كانت مجموعة البيانات الخاصة بك تتضمن مستندات متعددة لها جميعًا نفس القيمة لحقل المؤشر الخاص بك، مما يجعل موضع المؤشر غامضًا. يمكنك إضافة قيم حقول إضافية إلى المؤشر الخاص بك لتحديد نقطة البداية أو النهاية بشكل أكبر وتقليل الغموض.
على سبيل المثال، في مجموعة البيانات التي تحتوي على جميع المدن المسماة "Springfield" في الولايات المتحدة، ستكون هناك نقاط بداية متعددة لمجموعة استعلام تبدأ عند "Springfield":
مدن | |
---|---|
اسم | ولاية |
سبرينجفيلد | ماساتشوستس |
سبرينجفيلد | ميسوري |
سبرينجفيلد | ويسكونسن |
للبدء في Springfield محدد، يمكنك إضافة الحالة كشرط ثانوي في عبارة المؤشر.
Web modular API
// Will return all Springfields import { collection, query, orderBy, startAt } from "firebase/firestore"; const q1 = query(collection(db, "cities"), orderBy("name"), orderBy("state"), startAt("Springfield")); // Will return "Springfield, Missouri" and "Springfield, Wisconsin" const q2 = query(collection(db, "cities"), orderBy("name"), orderBy("state"), startAt("Springfield", "Missouri"));
Web namespaced API
// Will return all Springfields db.collection("cities") .orderBy("name") .orderBy("state") .startAt("Springfield"); // Will return "Springfield, Missouri" and "Springfield, Wisconsin" db.collection("cities") .orderBy("name") .orderBy("state") .startAt("Springfield", "Missouri");
سويفت
// Will return all Springfields db.collection("cities") .order(by: "name") .order(by: "state") .start(at: ["Springfield"]) // Will return "Springfield, Missouri" and "Springfield, Wisconsin" db.collection("cities") .order(by: "name") .order(by: "state") .start(at: ["Springfield", "Missouri"])
ج موضوعية
// Will return all Springfields [[[[db collectionWithPath:@"cities"] queryOrderedByField:@"name"] queryOrderedByField:@"state"] queryStartingAtValues:@[ @"Springfield" ]]; // Will return "Springfield, Missouri" and "Springfield, Wisconsin" [[[[db collectionWithPath:@"cities"] queryOrderedByField:@"name"] queryOrderedByField:@"state"] queryStartingAtValues:@[ @"Springfield", @"Missouri" ]];
Kotlin+KTX
// Will return all Springfields db.collection("cities") .orderBy("name") .orderBy("state") .startAt("Springfield") // Will return "Springfield, Missouri" and "Springfield, Wisconsin" db.collection("cities") .orderBy("name") .orderBy("state") .startAt("Springfield", "Missouri")
Java
// Will return all Springfields db.collection("cities") .orderBy("name") .orderBy("state") .startAt("Springfield"); // Will return "Springfield, Missouri" and "Springfield, Wisconsin" db.collection("cities") .orderBy("name") .orderBy("state") .startAt("Springfield", "Missouri");
Dart
// Will return all Springfields db .collection("cities") .orderBy("name") .orderBy("state") .startAt(["Springfield"]); // Will return "Springfield, Missouri" and "Springfield, Wisconsin" db .collection("cities") .orderBy("name") .orderBy("state") .startAt(["Springfield", "Missouri"]);
جافا
بايثون
Python
سي ++
// This is not yet supported.
Node.js
يذهب
بي أتش بي
بي أتش بي
لمعرفة المزيد حول تثبيت وإنشاء عميل Cloud Firestore، راجع مكتبات عميل Cloud Firestore .
وحدة
Query query1 = db.Collection("cities").OrderBy("Name").OrderBy("State").StartAt("Springfield"); Query query2 = db.Collection("cities").OrderBy("Name").OrderBy("State").StartAt("Springfield", "Missouri");