Запросы с двумя массивами с правилами безопасности пожарного депо - PullRequest
1 голос
/ 27 марта 2020

В настоящее время у меня есть два массива в одном документе, один представляет идентификаторы продуктов, а другой представляет идентификаторы пользователей. В моем запросе мне нужно запросить оба массива, чтобы правила безопасности пожарного хранилища работали правильно, но для этого я попытался использовать array-contains и in в одном запросе, что приемлемо в документации, но когда я go на запрос я получаю «отсутствующие или недостаточные разрешения».

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: использование get () в методе списка hasAny ()

Есть ли что-то, что мне не хватает или нужно сделать, чтобы этот запрос работал?

Спасибо в пользу се.

1 Ответ

1 голос
/ 28 марта 2020

Вам следует подумать о реструктуризации ваших данных, чтобы обеспечить необходимый запрос. Поскольку 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...