Firebase Query Error: hasInequality == field': All where filters with an inequality (<, <=, >, or >=) must be on the same field

Viewed 1125

I am trying to perform a Query but i keep getting this error which i did not understand.

i am trying to perform a complex query

hasInequality == field': All where filters with an inequality (<, <=, >, or >=) must be on the same field. But you have inequality filters on 'FieldPath([ageFrom])' and 'FieldPath([toAge]).

here is my code:

    Future<List<DiscoverUserModel>> getListOfUserData() async {
        List<DiscoverUserModel> usersData = [];
        try {
          final value =
              await firestore.collection("users").doc(auth.currentUser.uid).get();
          final element1 = value.data();
          print('============> $element1');
          var ageFrom = element1['Type']['Age']['ageFrom'];
          var toAge = element1['Type']['Age']['toAge'];
          var distanceFrom = element1['Type']['Distance']['distranceFrom'];
          var distanceTo = element1['Type']['Distance']['distanceTo'];
          print('===========> $ageFrom');
          print('==========> $toAge');
          print('=========> $distanceFrom');
          print('========> $distanceTo');
          if (ageFrom == '18.0' && distanceFrom == '0.0') {
            await firestore.collection("users").get().then((value) {
              value.docs.forEach((element) {
                // print('resulting: ${element.data()['bio']}');
                DiscoverUserModel discoverUserModel = DiscoverUserModel(
                    '${element.data()['name']}',
                    '${element.data()['email']}',
                    '${element.data()['phoneNumber']}',
                    '${element.data()['profilePictureUrl']}',
                    id: element.data()['id'].toString(),
                    bio: element.data()['bio'].toString(),
                    gender: element.data()['gender'].toString());
                usersData.add(discoverUserModel);
                usersData
                    .removeWhere((element) => element.id == auth.currentUser.uid);
                return usersData;
              });
            });
          } else {

//this query is where i am getting the error ........... from here...
            await firestore
                .collection('users')
                .where('ageFrom', isGreaterThanOrEqualTo: ageFrom)
                .where('toAge', isLessThanOrEqualTo: toAge)
                .where('distanceTo', isLessThanOrEqualTo: distanceTo)
                .where('distranceFrom', isGreaterThanOrEqualTo: distanceFrom)
                .get()
                .then(
                  (value1) => value1.docs.forEach((element) {
                    print('========ele==>$element');
                    DiscoverUserModel discoverUserModel = DiscoverUserModel(
                      '${element.data()['name']}',
                      '${element.data()['email']}',
                      '${element.data()['phoneNumber']}',
                      '${element.data()['profilePictureUrl']}',
                      id: element.data()['id'].toString(),
                      bio: element.data()['bio'].toString(),
                      gender: element.data()['gender'].toString(),
                    );
                    usersData.add(discoverUserModel);
                    usersData.removeWhere(
                        (element) => element.id == auth.currentUser.uid);
                    return usersData;
                  }),
                );
          }
    
          return usersData;
        } catch (e) {
          print(e.toString());
          return null;
        }
      }

I don't want to create the index from the console myself because is not good way..

what i want to query

1 Answers

You need to call the query on a single document field.

Right now, you are querying 4 different document fields (ageFrom, toAge, distanceTo, distranceFrom)

This will not work. Firebase doesn't currently support querying multiple fields in a single request.

All the .where query statements need to be on a single field. Filter most on the server, do the rest on the client.

So filter one document field and then filter the documents you get from that query on the client-side.

Related