Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Firestore says I have inequality filter on multiple properties, when I don't

I am trying to do a "small hack" to avoid reading the User document everytime the page loads. So I save it locally, everytime the page loads I get the local version, get the updated_at property and then do something like WHERE last_updated > {{updated_at}}. For that, I want to use this:

firebase.firestore().collection('User')
.where(firebase.firestore.FieldPath.documentId(), '==', firebase.auth().currentUser.uid)
.where('updated_at', '>', updated_at)
.get()

As you can see, I have one equality (==) and one inequality (>). Why do I get the following error on the console:

FirebaseError: Cannot have inequality filters on multiple properties: updated_at
    at new t (https://www.gstatic.com/firebasejs/6.0.2/firebase-firestore.js:1:47054)
    at t.fromRpcStatus (https://www.gstatic.com/firebasejs/6.0.2/firebase-firestore.js:1:116660)
    at t.fromWatchChange (https://www.gstatic.com/firebasejs/6.0.2/firebase-firestore.js:1:125914)
    at t.onMessage (https://www.gstatic.com/firebasejs/6.0.2/firebase-firestore.js:1:242411)
    at https://www.gstatic.com/firebasejs/6.0.2/firebase-firestore.js:1:241212
    at https://www.gstatic.com/firebasejs/6.0.2/firebase-firestore.js:1:241997
    at https://www.gstatic.com/firebasejs/6.0.2/firebase-firestore.js:1:144869

I am doing this to try to avoid reading from the database if the local version is the same as the one in the database. Maybe if you have a better way, please let me know.

Thanks

like image 949
Carlino Gonzalez Avatar asked Jun 28 '19 11:06

Carlino Gonzalez


1 Answers

firebaser here

The equality check you have on documentId() is internally converted into a range check by Firestore, because the keys are stored as the last items in existing indexes (if I understand correctly). And that means that server-side you're trying to perform two inequality/range checks, which isn't allowed.

So the behavior you are seeing is correct. But it's definitely not intuitive, and the error message is also not helpful. We'll look for a way to improve the error message by detecting this combination.

like image 179
Frank van Puffelen Avatar answered Nov 19 '22 06:11

Frank van Puffelen