我目前在一个文档中有两个数组,一个代表产品ID,另一个代表用户ID。在我的查询中,我需要查询两个数组以确保Firestore安全规则正常运行,但是为此,我尝试在同一查询中使用array-contains
和in
,这在文档中是可以接受的,但是当我查询时,我会得到“缺少权限或权限不足”。
db.collection('Depots')
.where("products", "array-contains", productId)
.where("users", "in", "lk9asdn340fk3fvb")
.get();
这是我的安全规则:
function uidAndProductInDocument() {
return request.auth.uid in resource.data.users;
}
这是文档内容的样子:
但是,即使此安全规则失败,也不返回任何内容,即使数据库中有文档应返回,因为它们与参数匹配。
我不确定如何确保产品关系,因为与产品用户的关系在另一个文档中,并且我在另一个问题中尝试了另一种方法,可以在这里找到: Firestore security rules: get() use in hasAny() list method
要使该查询正常工作,我有什么需要做的事情吗?
谢谢。
答案 0 :(得分:1)
您应该考虑重组数据,以支持所需的查询。由于Firestore无法执行两个包含数组的查询,因此应将其中一个数组转换为对象,其中的键是数组的值,而字段值就是true
。例如,您可以获取用户列表,并使每个用户的外观如下:
users: {
xxxx: true
yyyy: true
}
现在您可以像这样查询:
db.collection('Depots')
.where("products", "array-contains", productId)
.where(`users.${uid}`, "==", true)
.get();
您的规则可以像这样检查:
return resource.data.users[request.auth.uid]