2017-10-17 2 views
2

J'essaie d'implémenter multi requête et pagination avec Firestore, mais une fois que j'ajoute < ou> à la requête le curseur ne fonctionne pas.multi requête et pagination avec firestore

//working example: 
the doc id i save as propery on the doc 
ref.where('category','==' 'cats').where('status', '==', 1).orderBy('id').cursor('last doc id from the returned list').limit(3) 

//not working exmple: 

ref.where('category','==' 'cats').where('status', '==', 1).orderBy('price').where('price', '>=', 2).where('price', '<=', 55).orderBy('id').cursor('last doc id from the returned list').limit(3) 

aucune erreur renvoyée. est-ce bug avec Firestore ou sur mon extrémité.

Répondre

1

Il existe une documentation sur Firebase sur Pagination & Query et query data. Nous devons utiliser les méthodes startAt() ou startAfter() pour définir le point de départ d'une requête. De même, utilisez les méthodes endAt() ou endBefore() pour définir un point de fin pour vos résultats de requête.

Exemple: Pour obtenir toutes les villes avec une population> = 1000000, ordonnée par la population,

db.collection("cities") 
     .orderBy("population") 
     .startAt(1000000); 

et d'obtenir toutes les villes avec une population < = 1000000, ordonnée par la population,

db.collection("cities") 
     .orderBy("population") 
     .endAt(1000000); 

devrait donc être fait en utilisant cette méthode de pagination comme,

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

Une requête Firestore ne peut avoir qu'une seule condition de plage.

De l'documentation on queries:

Vous pouvez combiner where() filtres avec orderBy() et limit().

Cependant, si vous avez un filtre avec une comparaison de gamme (<, <=, >, >=), votre première commande doit être sur le même terrain:

non valide: Filtre Range et la première orderBy sur différents champs

citiesRef.where("population", ">", 100000).orderBy("country") 
+0

donc je ne peux pas combiner la comparaison de plage (<, <=, >,> =) avec startAfter sur une propriété différente? y at-il une solution pour cela? – haim

0

Comme Frank fait remarquer FireStore jusqu'à présent ne permet pas de combiner des plages sur des propriétés différentes. J'espère que Google résoudra ce problème un jour, avoir plusieurs filtres de gamme semble être une caractéristique essentielle pour n'importe quelle base de données.

Aussi c'est une solution plutôt laide, mais je suppose que vous pourriez omettre la partie .where('price', '>=', 2) et filtrer les données par la suite sur le client.

+0

merci l'homme que vous m'avez donné l'idée. je vais le changer de gamme à plus grand que. Je suppose que c'est mieux que rien. Je ne comprends vraiment pas pourquoi ils n'implémentent pas toutes ces fonctionnalités comme mongo. C'est vraiment difficile de travailler avec. – haim

+0

@shimonhatoka ils le feront correctement à l'avenir ... Ils ont ajouté beaucoup de nouvelles fonctionnalités depuis que j'ai commencé à l'utiliser l'année dernière :) –