使用Firestore安全规则查询两个数组

时间:2020-03-27 20:00:45

标签: firebase google-cloud-firestore firebase-authentication firebase-security

我目前在一个文档中有两个数组,一个代表产品ID,另一个代表用户ID。在我的查询中,我需要查询两个数组以确保Firestore安全规则正常运行,但是为此,我尝试在同一查询中使用array-containsin,这在文档中是可以接受的,但是当我查询时,我会得到“缺少权限或权限不足”。

db.collection('Depots')
  .where("products", "array-contains", productId)
  .where("users", "in", "lk9asdn340fk3fvb")
  .get();

这是我的安全规则:

function uidAndProductInDocument() {
    return request.auth.uid in resource.data.users;
}

这是文档内容的样子:

enter image description here

但是,即使此安全规则失败,也不返回任何内容,即使数据库中有文档应返回,因为它们与参数匹配。

我不确定如何确保产品关系,因为与产品用户的关系在另一个文档中,并且我在另一个问题中尝试了另一种方法,可以在这里找到: Firestore security rules: get() use in hasAny() list method

要使该查询正常工作,我有什么需要做的事情吗?

谢谢。

1 个答案:

答案 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]