使用where(in :)和where(isEqual :)的Firestore查询

时间:2020-07-21 16:43:58

标签: ios firebase google-cloud-firestore

在Firebase Firestore中是否可以进行以下组合where(in:)where(isEqualTo:)组合查询?

(快速)

let taskDocIds = ["0ArJnMgTfDkvolUcZR8E", "0cdcZsfaEJQpsiByJIgH"]

return db.collection("tasks")
      .whereField("status", isEqualTo: "approved")
      .whereField(Firebase.FieldPath.documentID(), in: taskDocIds)
      .limit(to: 100)
      .getDocuments(as: TaskModel.self)

我的安全规则强制执行,只能读取statusapproved的任务。但是,当ID在status数组中的任何任务的taskDocIds都具有status以外的approved时,上面的查询会导致错误(请参阅下文)。

错误:Domain = FIRFirestoreErrorDomain代码= 7“权限缺失或不足。”

如果可以查询,是否需要创建一个复合索引?如果是这样,如何去手动配置(使用Firebase控制台)FieldField文档ID?

1 个答案:

答案 0 :(得分:0)

添加索引永远无法解决权限错误。

问题是该规则不知道整个taskDocIds的集合是否可以被允许而不单独检查它们。 Firebase security rules are not filters,因此,在执行查询时,规则不会单独读取和检查每个文档,而只会为您提供匹配的文档。如果不能保证每个可以匹配查询的文档都完全 匹配查询,那么它只会使整个规则失效。

您的选择是简单地getDocument()每个人。对于单个文档,规则检查该文档的各个字段。