Reputation: 53
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
Reputation: 243
you must set the common 'whereField' outside your 'ifs', and inside your 'ifs' you must set the particular 'whereField'
Upvotes: 0
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