web-dev-qa-db-fra.com

Firestore: clauses Where conditionnelles multiples

Par exemple, j'ai un filtre dynamique pour ma liste de livres où je peux définir une couleur, des auteurs et des catégories spécifiques. Ce filtre peut définir plusieurs couleurs à la fois et plusieurs catégories.

   Book > Red, Blue > Adventure, Detective.

Comment ajouter conditionnellement "où"?

  firebase
    .firestore()
    .collection("book")
    .where("category", "==", )
    .where("color", "==", )
    .where("author", "==", )

    .orderBy("date")
    .get()
    .then(querySnapshot => {...
10
rendom

Comme vous pouvez le voir dans la documentation de l'API, la méthode collection () renvoie un CollectionReference . CollectionReference étend Requête . Query.where () et Query.orderBy () renvoient également des objets Query. Vous pouvez donc réécrire votre code comme ceci:

var query = firebase.firestore().collection("book")
query = query.where(...)
query = query.where(...)
query = query.where(...)
query = query.orderBy(...)
query.get().then(...)

Vous pouvez maintenant mettre des conditions pour déterminer les filtres que vous souhaitez appliquer à chaque étape.

30
Doug Stevenson

En plus de la réponse de @Doug Stevenson. Lorsque vous avez plus d'un where il faut le rendre plus dynamique comme dans mon cas.

function readDocuments(collection, options = {}) {
    let {where, orderBy, limit} = options;
    let query = firebase.firestore().collection(collection);

    if (where) {
        if (where[0] instanceof Array) {
            // It's an array of array
            for (let w of where) {
                query = query.where(...w);
            }
        } else {
            query = query.where(...where);
        }

    }

    if (orderBy) {
        query = query.orderBy(...orderBy);
    }

    if (limit) {
        query = query.limit(limit);
    }

    return query
            .get()
            .then()
            .catch()
    }

// Usage
// Multiple where
let options = {where: [["category", "==", "someCategory"], ["color", "==", "red"], ["author", "==", "Sam"]], orderBy: ["date", "desc"]};

//OR
// A single where
let options = {where: ["category", "==", "someCategory"]};

let documents = readDocuments("books", options);
0
Abk