Paginar datos con cursores de consulta

Con los cursores de consulta en Cloud Firestore, puedes dividir los datos devueltos por una consulta en lotes según los parámetros que definas en tu consulta.

Los cursores de consulta definen los puntos de inicio y finalización de una consulta, lo que le permite:

  • Devuelve un subconjunto de los datos.
  • Paginar resultados de consultas.

Sin embargo, para definir un rango específico para una consulta, debe utilizar el método where() descrito en Consultas simples .

Agregar un cursor simple a una consulta

Utilice los métodos startAt() o startAfter() para definir el punto de inicio de una consulta. El método startAt() incluye el punto de inicio, mientras que el método startAfter() lo excluye.

Por ejemplo, si usa startAt(A) en una consulta, devuelve el alfabeto completo. Si usa startAfter(A) en su lugar, devuelve BZ .

import { query, orderBy, startAt } from "firebase/firestore";  

const q = query(citiesRef, orderBy("population"), startAt(1000000));
citiesRef.orderBy("population").startAt(1000000);
Nota: Este producto no está disponible en destinos watchOS y App Clip.
// Get all cities with population over one million, ordered by population.
db.collection("cities")
 
.order(by: "population")
 
.start(at: [1000000])
Nota: Este producto no está disponible en destinos watchOS y App Clip.
// Get all cities with population over one million, ordered by population.
[[[db collectionWithPath:@"cities"]
    queryOrderedByField
:@"population"]
    queryStartingAtValues
:@[ @1000000 ]];
// Get all cities with a population >= 1,000,000, ordered by population,
db
.collection("cities")
   
.orderBy("population")
   
.startAt(1000000)
// Get all cities with a population >= 1,000,000, ordered by population,
db
.collection("cities")
       
.orderBy("population")
       
.startAt(1000000);
db.collection("cities").orderBy("population").startAt([1000000]);
Query query = cities.orderBy("population").startAt(4921000L);
cities_ref = db.collection("cities")
query_start_at
= cities_ref.order_by("population").start_at({"population": 1000000})
cities_ref = db.collection("cities")
query_start_at
= cities_ref.order_by("population").start_at({"population": 1000000})
// Get all cities with a population >= 1,000,000, ordered by population,
db
->Collection("cities")
   
.OrderBy("population")
   
.StartAt({FieldValue::Integer(1000000)});
const startAtRes = await db.collection('cities')
 
.orderBy('population')
 
.startAt(1000000)
 
.get();
query := client.Collection("cities").OrderBy("population", firestore.Asc).StartAt(1000000)

PHP

Para obtener más información sobre cómo instalar y crear un cliente de Cloud Firestore, consulte Bibliotecas de clientes de Cloud Firestore .

$query = $citiesRef
   
->orderBy('population')
   
->startAt([1000000]);
Query query = citiesRef.OrderBy("Population").StartAt(1000000);
Query query = citiesRef.OrderBy("Population").StartAt(1000000);
query = cities_ref.order("population").start_at(1_000_000)

De manera similar, use los métodos endAt() o endBefore() para definir un punto final para los resultados de su consulta.

import { query, orderBy, endAt } from "firebase/firestore";  

const q = query(citiesRef, orderBy("population"), endAt(1000000));
citiesRef.orderBy("population").endAt(1000000);
Nota: Este producto no está disponible en destinos watchOS y App Clip.
// Get all cities with population less than one million, ordered by population.
db.collection("cities")
 
.order(by: "population")
 
.end(at: [1000000])
Nota: Este producto no está disponible en destinos watchOS y App Clip.
// Get all cities with population less than one million, ordered by population.
[[[db collectionWithPath:@"cities"]
    queryOrderedByField
:@"population"]
    queryEndingAtValues
:@[ @1000000 ]];
// Get all cities with a population <= 1,000,000, ordered by population,
db
.collection("cities")
   
.orderBy("population")
   
.endAt(1000000)
// Get all cities with a population <= 1,000,000, ordered by population,
db
.collection("cities")
       
.orderBy("population")
       
.endAt(1000000);
db.collection("cities").orderBy("population").endAt([1000000]);
Query query = cities.orderBy("population").endAt(4921000L);
cities_ref = db.collection("cities")
query_end_at
= cities_ref.order_by("population").end_at({"population": 1000000})
cities_ref = db.collection("cities")
query_end_at
= cities_ref.order_by("population").end_at({"population": 1000000})
// Get all cities with a population <= 1,000,000, ordered by population,
db
->Collection("cities")
   
.OrderBy("population")
   
.EndAt({FieldValue::Integer(1000000)});
const endAtRes = await db.collection('cities')
 
.orderBy('population')
 
.endAt(1000000)
 
.get();
query := client.Collection("cities").OrderBy("population", firestore.Asc).EndAt(1000000)

PHP

Para obtener más información sobre cómo instalar y crear un cliente de Cloud Firestore, consulte Bibliotecas de clientes de Cloud Firestore .

$query = $citiesRef
   
->orderBy('population')
   
->endAt([1000000]);
Query query = citiesRef.OrderBy("Population").EndAt(1000000);
Query query = citiesRef.OrderBy("Population").EndAt(1000000);
query = cities_ref.order("population").end_at(1_000_000)

Utilice una instantánea del documento para definir el cursor de consulta

También puede pasar una instantánea del documento a la cláusula del cursor como punto inicial o final del cursor de consulta. Los valores de la instantánea del documento sirven como valores en el cursor de consulta.

Por ejemplo, tome una instantánea de un documento de "San Francisco" en su conjunto de datos de ciudades y poblaciones. Luego, utilice esa instantánea del documento como punto de partida para el cursor de consulta de población. Su consulta devolverá todas las ciudades con una población mayor o igual a la de San Francisco, como se define en la instantánea del documento.

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));
// ...
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);

   
// ...
});
Nota: Este producto no está disponible en destinos watchOS y App Clip.
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)
 
}
Nota: Este producto no está disponible en destinos watchOS y App Clip.
[[[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];
   
}];
// 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)

       
// ...
   
}
// 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);

               
// ...
           
}
       
});
db.collection("cities").doc("SF").get().then(
 
(documentSnapshot) {
   
final biggerThanSf = db
       
.collection("cities")
       
.orderBy("population")
       
.startAtDocument(documentSnapshot);
 
},
  onError
: (e) => print("Error: $e"),
);
// Fetch the snapshot with an API call, waiting for a maximum of 30 seconds for a result.
ApiFuture<DocumentSnapshot> future = db.collection("cities").document("SF").get();
DocumentSnapshot snapshot = future.get(30, TimeUnit.SECONDS);

// Construct the query
Query query = db.collection("cities").orderBy("population").startAt(snapshot);
doc_ref = db.collection("cities").document("SF")

snapshot
= doc_ref.get()
start_at_snapshot
= (
    db
.collection("cities").order_by("population").start_at(snapshot)
)
doc_ref = db.collection("cities").document("SF")

snapshot
= await doc_ref.get()
start_at_snapshot
= (
    db
.collection("cities").order_by("population").start_at(snapshot)
)
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});
       
// ...
     
}
   
});
const docRef = db.collection('cities').doc('SF');
const snapshot = await docRef.get();
const startAtSnapshot = db.collection('cities')
 
.orderBy('population')
 
.startAt(snapshot);

await startAtSnapshot
.limit(10).get();
cities := client.Collection("cities")
dsnap
, err := cities.Doc("SF").Get(ctx)
if err != nil {
        fmt
.Println(err)
}
query
:= cities.OrderBy("population", firestore.Asc).StartAt(dsnap.Data()["population"]).Documents(ctx)

PHP

Para obtener más información sobre cómo instalar y crear un cliente de Cloud Firestore, consulte Bibliotecas de clientes de Cloud Firestore .

$citiesRef = $db->collection('samples/php/cities');
$docRef
= $citiesRef->document('SF');
$snapshot
= $docRef->snapshot();

$query
= $citiesRef
   
->orderBy('population')
   
->startAt($snapshot);
CollectionReference citiesRef = db.Collection("cities");
DocumentReference docRef = citiesRef.Document("SF");
docRef
.GetSnapshotAsync().ContinueWith((snapshotTask) =>
{
   
Query query = citiesRef.OrderBy("Population").StartAt(snapshotTask.Result);
});
CollectionReference citiesRef = db.Collection("cities");
DocumentReference docRef = citiesRef.Document("SF");
DocumentSnapshot snapshot = await docRef.GetSnapshotAsync();
Query query = citiesRef.OrderBy("Population").StartAt(snapshot);
doc_ref = firestore.doc "#{collection_path}/SF"
snapshot
= doc_ref.get
query
= cities_ref.order("population").start_at(snapshot)

Paginar una consulta

Paginar consultas combinando cursores de consulta con el método limit() . Por ejemplo, utilice el último documento de un lote como inicio del cursor para el siguiente lote.

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));
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);
});
Nota: Este producto no está disponible en destinos watchOS y App Clip.
// 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.
  // ...
}
Nota: Este producto no está disponible en destinos watchOS y App Clip.
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.
 
// ...
}];
// 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
       
// ...
   
}
// 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
           
// ...
       
}
   
});
// 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")
       
.startAfterDocument(lastVisible).limit(25);

   
// Use the query for pagination
   
// ...
 
},
  onError
: (e) => print("Error completing: $e"),
);
// Construct query for first 25 cities, ordered by population.
CollectionReference cities = db.collection("cities");
Query firstPage = cities.orderBy("population").limit(25);

// Wait for the results of the API call, waiting for a maximum of 30 seconds for a result.
ApiFuture<QuerySnapshot> future = firstPage.get();
List<QueryDocumentSnapshot> docs = future.get(30, TimeUnit.SECONDS).getDocuments();

// Construct query for the next 25 cities.
QueryDocumentSnapshot lastDoc = docs.get(docs.size() - 1);
Query secondPage = cities.orderBy("population").startAfter(lastDoc).limit(25);

future
= secondPage.get();
docs
= future.get(30, TimeUnit.SECONDS).getDocuments();
cities_ref = db.collection("cities")
first_query
= cities_ref.order_by("population").limit(3)

# Get the last document from the results
docs
= first_query.stream()
last_doc
= list(docs)[-1]

# 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
last_pop
= last_doc.to_dict()["population"]

next_query
= (
    cities_ref
.order_by("population").start_after({"population": last_pop}).limit(3)
)
# Use the query for pagination
# ...
cities_ref = db.collection("cities")
first_query
= cities_ref.order_by("population").limit(3)

# Get the last document from the results
docs
= [d async for d in first_query.stream()]
last_doc
= list(docs)[-1]

# 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
last_pop
= last_doc.to_dict()["population"]

next_query
= (
    cities_ref
.order_by("population").start_after({"population": last_pop}).limit(3)
)
# Use the query for pagination
# ...
// 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
 
// ...
});
const first = db.collection('cities')
 
.orderBy('population')
 
.limit(3);

const snapshot = await first.get();

// Get the last document
const last = snapshot.docs[snapshot.docs.length - 1];

// 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.
const next = db.collection('cities')
 
.orderBy('population')
 
.startAfter(last.data().population)
 
.limit(3);

// Use the query for pagination
// ...
cities := client.Collection("cities")

// Get the first 25 cities, ordered by population.
firstPage
:= cities.OrderBy("population", firestore.Asc).Limit(25).Documents(ctx)
docs
, err := firstPage.GetAll()
if err != nil {
       
return err
}

// Get the last document.
lastDoc
:= docs[len(docs)-1]

// Construct a new query to get the next 25 cities.
secondPage
:= cities.OrderBy("population", firestore.Asc).
       
StartAfter(lastDoc.Data()["population"]).
       
Limit(25)

// ...

PHP

Para obtener más información sobre cómo instalar y crear un cliente de Cloud Firestore, consulte Bibliotecas de clientes de Cloud Firestore .

$citiesRef = $db->collection('samples/php/cities');
$firstQuery
= $citiesRef->orderBy('population')->limit(3);

# Get the last document from the results
$documents
= $firstQuery->documents();
$lastPopulation
= 0;
foreach ($documents as $document) {
    $lastPopulation
= $document['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
$nextQuery
= $citiesRef->orderBy('population')->startAfter([$lastPopulation]);
$snapshot
= $nextQuery->documents();
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();
CollectionReference citiesRef = db.Collection("cities");
Query firstQuery = citiesRef.OrderBy("Population").Limit(3);

// Get the last document from the results
QuerySnapshot querySnapshot = await firstQuery.GetSnapshotAsync();
long lastPopulation = 0;
foreach (DocumentSnapshot documentSnapshot in querySnapshot.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);
QuerySnapshot secondQuerySnapshot = await secondQuery.GetSnapshotAsync();
cities_ref  = firestore.col collection_path
first_query
= cities_ref.order("population").limit(3)

# Get the last document from the results.
last_population
= 0
first_query
.get do |city|
  last_population
= city.data[:population]
end

# 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.
second_query
= cities_ref.order("population").start_after(last_population)
second_query
.get do |city|
  puts
"Document #{city.document_id} returned by paginated query cursor."
end

Establecer cursor en función de múltiples campos

Cuando utiliza un cursor basado en un valor de campo (no en una instantánea de documento), puede hacer que la posición del cursor sea más precisa agregando campos adicionales. Esto es particularmente útil si su conjunto de datos incluye varios documentos y todos tienen el mismo valor para el campo del cursor, lo que hace que la posición del cursor sea ambigua. Puede agregar valores de campo adicionales al cursor para especificar aún más el punto inicial o final y reducir la ambigüedad.

Por ejemplo, en un conjunto de datos que contenga todas las ciudades denominadas "Springfield" en los Estados Unidos, habrá varios puntos de inicio para que una consulta comience en "Springfield":

Ciudades
Nombre Estado
Springfield Massachusetts
Springfield Misuri
Springfield Wisconsin

Para comenzar en un Springfield específico, puede agregar el estado como condición secundaria en la cláusula del cursor.

// 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"));
// 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");
Nota: Este producto no está disponible en destinos watchOS y App Clip.
// 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"])
Nota: Este producto no está disponible en destinos watchOS y App Clip.
// 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" ]];
// 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")
       
.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")
   
.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
Query query1 = db.collection("cities").orderBy("name").orderBy("state").startAt("Springfield");

// Will return "Springfield, Missouri" and "Springfield, Wisconsin"
Query query2 =
    db
.collection("cities").orderBy("name").orderBy("state").startAt("Springfield", "Missouri");
start_at_name = (
    db
.collection("cities").order_by("name").start_at({"name": "Springfield"})
)

start_at_name_and_state
= (
    db
.collection("cities")
   
.order_by("name")
   
.order_by("state")
   
.start_at({"name": "Springfield", "state": "Missouri"})
)
start_at_name = (
    db
.collection("cities")
   
.order_by("name")
   
.order_by("state")
   
.start_at({"name": "Springfield"})
)

start_at_name_and_state
= (
    db
.collection("cities")
   
.order_by("name")
   
.order_by("state")
   
.start_at({"name": "Springfield", "state": "Missouri"})
)
// This is not yet supported.
// Will return all Springfields
const startAtNameRes = await db.collection('cities')
 
.orderBy('name')
 
.orderBy('state')
 
.startAt('Springfield')
 
.get();

// Will return 'Springfield, Missouri' and 'Springfield, Wisconsin'
const startAtNameAndStateRes = await db.collection('cities')
 
.orderBy('name')
 
.orderBy('state')
 
.startAt('Springfield', 'Missouri')
 
.get();
// Will return all Springfields.
client
.Collection("cities").
       
OrderBy("name", firestore.Asc).
       
OrderBy("state", firestore.Asc).
       
StartAt("Springfield")

// Will return Springfields where state comes after Wisconsin.
client
.Collection("cities").
       
OrderBy("name", firestore.Asc).
       
OrderBy("state", firestore.Asc).
       
StartAt("Springfield", "Wisconsin")

PHP

Para obtener más información sobre cómo instalar y crear un cliente de Cloud Firestore, consulte Bibliotecas de clientes de Cloud Firestore .

// Will return all Springfields
$query1
= $db
   
->collection('samples/php/cities')
   
->orderBy('name')
   
->orderBy('state')
   
->startAt(['Springfield']);

// Will return "Springfield, Missouri" and "Springfield, Wisconsin"
$query2
= $db
   
->collection('samples/php/cities')
   
->orderBy('name')
   
->orderBy('state')
   
->startAt(['Springfield', 'Missouri']);
Query query1 = db.Collection("cities").OrderBy("Name").OrderBy("State").StartAt("Springfield");
Query query2 = db.Collection("cities").OrderBy("Name").OrderBy("State").StartAt("Springfield", "Missouri");
Query query1 = db.Collection("cities").OrderBy("Name").OrderBy("State").StartAt("Springfield");
Query query2 = db.Collection("cities").OrderBy("Name").OrderBy("State").StartAt("Springfield", "Missouri");
# Will return all Springfields
query1
= firestore.col(collection_path).order("name").order("state").start_at("Springfield")

# Will return "Springfield, Missouri" and "Springfield, Wisconsin"
query2
= firestore.col(collection_path).order("name").order("state").start_at(["Springfield", "Missouri"])