В правилах Cloud Firestore - как проверить, является ли ключ нулевым

В Правилах Cloud Firestore - у меня есть документ с именем task, и я хочу узнать, являются ли некоторые данные (поле assignee) нулевыми или не существуют.

Я пробовал:

  1. resource.data.assignee == null - Не работает (Ошибка)
  2. !resource.data.hasAll(['assignee']) - Не работает (Ошибка)

Из документации - там указано, что это действительно создает ошибку: // Error, key doesn't exist allow read: if resource.data.nonExistentKey == 'value';


person Gal Bracha    schedule 08.10.2017    source источник
comment
Вот полный файл правил - github.com/Metaburn/doocrate/blob/master /firestore.rules Насколько я понимаю, resource - это документ, поскольку я использую match /tasks/{anyTask} { Из документации firebase на ресурсе - firebase.google.com/docs/firestore/reference/security/   -  person Gal Bracha    schedule 08.10.2017
comment
Мне не нужно проверять наличие документа - я знаю, что документ есть. Я хочу проверить наличие поля внутри этого документа. так что /tasks/my-task - tasks - это коллекция. my-task - это документ. А внутри есть поле assignee - я хочу посмотреть, нулевое оно или нет, и не могу   -  person Gal Bracha    schedule 08.10.2017
comment
Есть функция resource.data.keys(), попробуйте вместо нее использовать hasAll(['assignee']).   -  person Callam    schedule 08.10.2017
comment
@Callam Посмотрите вопрос под номером 2 - как я уже писал -! Resource.data.hasAll (['assignee']) - не работает (создает ошибку)   -  person Gal Bracha    schedule 08.10.2017
comment
Может тебе повезет с !resource.data.keys().hasAll(['assignee'])   -  person Callam    schedule 08.10.2017
comment
Я отвечу, рад, что мы туда попали!   -  person Callam    schedule 08.10.2017
comment
Бум @Callam Ты понял.   -  person Gal Bracha    schedule 08.10.2017
comment
Да, вы пропустили keys()   -  person Vlad    schedule 21.02.2018


Ответы (3)


Прочитав сравнение списков в документации по правилам безопасности Firestore здесь, мы увидим что hasAll возвращает истину, если в списке присутствуют все значения.

// Allow read if one list has all items in the other list
allow read: if ['username', 'age'].hasAll(['username', 'age']);

request.resource.data - это карта, содержащая поля и значения. Чтобы использовать hasAll, мы должны сначала получить ключи в виде списка значений, как показано здесь.

!resource.data.keys().hasAll(['assignee'])
person Callam    schedule 08.10.2017
comment
!('asignee' in resource.data.keys()) тоже должно работать? Еще одна вещь, на которую следует обратить внимание, это из документов правил: поля, не указанные в запросе, которые существуют в ресурсе, добавляются в request.resource.data. Правила могут проверять, изменено ли поле, сравнивая request.resource.data.foo с resource.data.foo, зная, что каждое поле в resource также будет присутствовать в request.resource, даже если оно не было отправлено в запросе на запись, поэтому могут быть случаи, когда ключ существует, а вы не не ожидал ... - person Andrew M.; 10.01.2018
comment
@ menehune23 Это правда, и из-за этого очень сложно определить, есть ли в клиентском приложении поле not, если оно уже существует в ресурсе. Кроме того, копирование ресурса в поля запроса не соблюдается симулятором правил, поэтому вы можете создать обновление в симуляторе, которое работает, но не будет работать в настоящее приложение ... Очень неприятно. - person dsl101; 09.10.2018

Глядя на документы - https://firebase.google.com/docs/reference/rules/rules.Map

k in x  - Check if key k exists in map x

так что это должно работать (без ключей ())

!('assignee' in resource.data) 
person pdkn    schedule 09.11.2018

если вы хотите убедиться, что ключ имеет значение NULL, вам необходимо убедиться, что этот ключ не является частью свойства ключей ресурсов:
!resource.data.keys().hasAny(['assignee'])

вы также можете использовать hasAll или hasOnly. дополнительная информация здесь

person Sagiv Ofek    schedule 19.11.2019