Firestore说,我没有多个属性时使用不平等过滤器

时间:2019-06-28 11:15:55

标签: javascript firebase google-cloud-firestore

我正在尝试做一个“小技巧”,以避免每次页面加载时都阅读User文档。因此,我将它保存在本地,每次页面加载时,我都会获得本地版本,获得updated_at属性,然后执行类似WHERE last_updated > {{updated_at}}的操作。为此,我想使用这个:

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

如您所见,我有一个等式(==)和一个不等式(>)。为什么在控制台上出现以下错误:

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

如果本地版本与数据库中的本地版本相同,我这样做是为了避免从数据库中读取。也许您有更好的方法,请告诉我。

谢谢

2 个答案:

答案 0 :(得分:1)

firebaser here

您在documentId()上进行的相等性检查会在内部由Firestore转换为范围检查,因为键被存储为现有索引中的最后一项(如果我理解正确的话)。这意味着在服务器端,您正在尝试执行两个不相等/范围检查,这是不允许的。

因此,您看到的行为是正确的。但这绝对不是直观的,并且错误消息也没有帮助。我们将寻找一种通过检测这种组合来改善错误消息的方法。

答案 1 :(得分:0)

我遇到了同样的问题,并且实施了以下破解措施:我将ID作为字段名称的一部分添加了,在此字段中检查了最新版本。如果您的逻辑允许您这样做,那么对您而言,这意味着:

firebase.firestore().collection('User')
.where(id + '_updated_at', '>', updated_at)
.get()

这允许仅在一个where语句中捆绑对ID和日期的检查(具有不同ID的文档将没有字段id + '_updated_at',因此不会被选中)。

对我来说就像一个魅力