在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)
我的安全规则强制执行,只能读取status
为approved
的任务。但是,当ID在status
数组中的任何任务的taskDocIds
都具有status
以外的approved
时,上面的查询会导致错误(请参阅下文)。
错误:Domain = FIRFirestoreErrorDomain代码= 7“权限缺失或不足。”
如果可以查询,是否需要创建一个复合索引?如果是这样,如何去手动配置(使用Firebase控制台)FieldField文档ID?
答案 0 :(得分:0)
添加索引永远无法解决权限错误。
问题是该规则不知道整个taskDocIds
的集合是否可以被允许而不单独检查它们。 Firebase security rules are not filters,因此,在执行查询时,规则不会单独读取和检查每个文档,而只会为您提供匹配的文档。如果不能保证每个可以匹配查询的文档都完全 匹配查询,那么它只会使整个规则失效。
您的选择是简单地getDocument()
每个人。对于单个文档,规则将检查该文档的各个字段。