73 votes

Firestore: comment effectuer une requête avec inégalité / pas égal

Je veux sélectionner dans la collection Firestore uniquement les articles écrits PAS par moi.
Est-ce vraiment si difficile?

Chaque article a le champ "owner_uid".

C'est ça:
Je veux juste écrire équivalent à "select * from articles where uid<>request.auth.uid"

95voto

Doug Stevenson Points 6978

Firestore ne fournit pas l'inégalité des contrôles. Selon la documentation:

La méthode where() prend trois paramètres: un champ à filtrer, une opération de comparaison, et une valeur. La comparaison peut être <, <=, ==, >, ou >=.

L'inégalité des opérations n'évoluent pas comme les autres opérations qui utilisent un index. Firestore indices sont bons pour la gamme des requêtes. Avec ce type d'index, pour une inégalité de requête, le backend aurait encore à la numérisation de chaque document de la collection afin d'arriver à des résultats, et c'est extrêmement mauvais pour la performance lorsque le nombre de documents se développe de grandes.

Si vous avez besoin de filtrer vos résultats de supprimer des objets en particulier, vous pouvez encore le faire localement.

Vous avez également la possibilité d'utiliser de multiples requêtes pour exclure une valeur distincte. Quelque chose comme cela, si vous voulez à tout sauf à la 12. Requête pour valeur < 12, une requête pour valeur > 12, puis de fusionner les résultats au client.

6voto

Jurij Pitulja Points 840

Pour Android, il devrait être facile de mettre en œuvre avec Task Api . Exemple de débutant:

     FirebaseFirestore db = FirebaseFirestore.getInstance();
    Query lessQuery = db.collection("users").whereLessThan("uid", currentUid);
    Query greaterQuery = db.collection("users").whereGreaterThan("uid", currentUid);
    Task lessQuery Task = firstQuery.get();
    Task greaterQuery = secondQuery.get();

    Task combinedTask = Tasks.whenAllSuccess(lessQuery , greaterQuery)
                             .addOnSuccessListener(new OnSuccessListener<List<Object>>() {
        @Override
        public void onSuccess(List<Object> list) {

            //This is the list of "users" collection without user with currentUid
        }
    });
 

En outre, avec cela, vous pouvez combiner n'importe quel ensemble de requêtes.

Pour le web il y a rxfire

1voto

Ruan Points 508

De la documentation de firebase

Requêtes avec une clause! =. Dans ce cas, vous devez scinder la requête en une requête supérieure à et une requête inférieure à. Par exemple, bien que la clause de requête où ("age", "! =", "30") ne soit pas prise en charge, vous pouvez obtenir le même jeu de résultats en combinant deux requêtes, une avec la clause où ("age", "< "," 30 ") et un avec la clause où (" age ","> ", 30).

-1voto

BLasan Points 14
 let query = docRef.where('role','>',user_role).where('role','<',user_role).get()
 

Cela ne fonctionne pas comme l'opération "pas égale" dans le magasin de stockage avec des valeurs de chaîne

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X