William B
William B

Reputation: 53

Firebase Firestore multiple queries

Hi, I'm trying to add a filter on top of a query, however, it's not working. It's causing useless repetition in the code. Can someone help me?

Is there a way to add more .whereField to an existant Ref?

Thanks! William

        var usersRef:Query

    if (DAgeMin == DAgeMax) {
        if (DGender == "Both") {
            usersRef = Firestore.firestore().collection("users")
                .whereField("AccountCompleted", isEqualTo: true)
                .whereField("Banned", isEqualTo: 0)
                .whereField("Age", isEqualTo: DAgeMin as Any)
            // usersRef.limit(to: 1)
        } else {
            usersRef = Firestore.firestore().collection("users")
                .whereField("AccountCompleted", isEqualTo: true)
                .whereField("Banned", isEqualTo: 0)
                .whereField("Gender", isEqualTo: DGender as Any)
                .whereField("Age", isEqualTo: DAgeMin as Any)
            // usersRef.limit(to: 1)
        }
    } else {
        if (DGender == "Both") {

            usersRef = Firestore.firestore().collection("users")
            // Not working, filters aren't being applied
                usersRef
                .whereField("AccountCompleted", isEqualTo: true)
                .whereField("Banned", isEqualTo: 0)
                .whereField("Age", isGreaterThanOrEqualTo: DAgeMin as Any)
                .whereField("Age", isLessThanOrEqualTo: DAgeMax as Any)


            // usersRef.limit(to: 1)
        } else {
            usersRef = Firestore.firestore().collection("users")
                .whereField("AccountCompleted", isEqualTo: true)
                .whereField("Banned", isEqualTo: 0)
                .whereField("Gender", isEqualTo: DGender as Any)
                .whereField("Age", isGreaterThanOrEqualTo: DAgeMin as Any)
                .whereField("Age", isLessThanOrEqualTo: DAgeMax as Any)
            // usersRef.limit(to: 1)

        }
    }
    // How can I apply this filter to all the usersRef, without putting it after each "block"
    usersRef.limit(to: 1)


    usersRef.getDocuments() { (querySnapshot, err) in

Upvotes: 3

Views: 1377

Answers (2)

Ramires Nascimento
Ramires Nascimento

Reputation: 243

you must set the common 'whereField' outside your 'ifs', and inside your 'ifs' you must set the particular 'whereField'

Upvotes: 0

imsucks
imsucks

Reputation: 71

I ran into a similar problem in javascript. I'm not familiar with swift so the syntax will be different but hopefully it can help you too.

const userRef = firebase.firestore().collection("users");
var query = userRef.where("AccountCompleted", "==", true);


if (condition) {
    query = query.where("color", "==", "red");
}
else {
    query = query.where("color", "==", "blue");
}


if (differentCondition) {
    query = query.where("number", "==", 10);
}
else {
    query = query.where("number", "==", 12);
}


query = query.limit(1);

This allowed me to chain different where() methods depending on the conditions and then you could add the limit() method after you finished building your query.

Upvotes: 3

Related Questions