web-dev-qa-db-fra.com

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

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

Chaque article a le champ "owner_uid".

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

27
android51130

Firestore ne fournit pas de contrôle d'inégalité. Selon la documentation :

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

Les opérations d’inégalité n’ont pas l’échelle comme les autres opérations utilisant un index . Les index Firestore conviennent aux requêtes de plage. Avec ce type d’index, pour une requête d’inégalité, le serveur devait toujours analyser chaque document de la collection pour obtenir des résultats, ce qui est extrêmement mauvais pour les performances lorsque le nombre de documents augmente.

Si vous devez filtrer vos résultats pour supprimer des éléments particuliers, vous pouvez toujours le faire localement.

Vous avez également la possibilité d'utiliser plusieurs requêtes pour exclure une valeur distincte. Quelque chose comme ceci, si vous voulez tout sauf 12. Requête pour la valeur <12, puis requête pour la valeur> 12, puis fusionnez les résultats dans le client.

28
Doug Stevenson

Je pense que c'est un peu injuste de critiquer Firestore dans cette affaire. La proposition de valeur de Firestore est la performance et elle est conçue pour la performance en lecture. Si votre principal objectif est la polyvalence des requêtes, par exemple, Firestore peut ne pas être votre numéro un; la polyvalence et la performance dans ce cas sont inversement corrélées (à quel degré, je ne sais pas - il serait intéressant de voir un graphique linéaire). Rappelez-vous, nous recherchons toujours un MVP. Et lorsque nous travaillons avec des bases de données basées sur la performance, telles que Firestore, nous devrions nous efforcer d'utiliser MVQ - une requête minimalement viable.

Dans le cas d'OP, quelle importance revêt pour vous cette question d'inégalité? Si cela ne convient pas à votre MVQ, éliminez-le. Si c'est aussi important que cela, y a-t-il un certain nombre de chaînes sur lesquelles il faut interroger? L'utilisateur doit-il parfois interroger le mot "et", par exemple? Probablement pas. Envisagez d'utiliser une fonction cloud qui écoute ces sous-chaînes et, lorsqu'elles apparaissent ou disparaissent, la fonction bascule dans un booléen du document parent qui vous permet de savoir quels documents contiennent ou non ces mots. Vous pouvez désormais effectuer une requête d'inégalité de chaîne sans avoir à parcourir la collection entière (car le booléen est indexé), sans exécuter deux requêtes, sans utiliser d'opérateur d'intervalle et sans analyser les résultats localement.

1
bsod

De la documentation de firebase

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

0
Ruan