下面的复合where(in:)和where(isEqualTo:)查询可以在Firestore中进行吗?
(Swift)
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数组中的任务的status有一个status而不是approved时,上面的查询将导致一个错误(参见下面)。
错误: Domain=FIRFirestoreErrorDomain Code=7“缺少权限或权限不足”。
如果查询是可能的,那么是否需要创建一个复合索引?如果是这样的话,如何手动(使用Firebase控制台)配置FieldPath文档id?
发布于 2020-07-21 16:52:54
权限错误永远不能通过添加索引来解决。
问题是,如果不单独检查整个taskDocIds集,规则就不知道是否允许它们。因此,在执行查询时,规则防火墙安全规则不是过滤器。 不会单独读取和检查每个文档(),而只提供匹配的文档。如果不能保证每个可以匹配查询的文档都与查询完全匹配,那么它就会导致整个规则失败。
你的选择是简单的getDocument()每一个单独的。对于单个文档gets,规则将检查文档的各个字段。
https://stackoverflow.com/questions/63019155
复制相似问题