в транзакции Cloud Firestore. Как проверить, существует ли документ в определенной коллекции, если мы не знаем имя документа - PullRequest
0 голосов
/ 01 июля 2018

в облачных транзакциях Firestore, как мы можем узнать, существует ли документ в Коллекции, когда мы просто знаем имя поля и его значение, а не само имя документа?

* я знаю название коллекции

* я знаю не знаю название документа

* я знаю field_name и field_value, которые я ищу

например, если бы я не был в транзакциях, я мог бы сделать это следующим образом в python

def if_Exists(self):
    db = firestore.client()
    docs = db.collection(u'cities').where(u'field_name', u'==', 'field_value').get()

    for doc in docs:
        if bool(doc.to_dict()):
            return True
        return False

но в транзакциях, например, в приведенном ниже примере кода (из документации Google) я не знаю, как я могу использовать метод where (который я использовал в методе if_Exists ())

transaction = db.transaction()
city_ref = db.collection(u'cities').document(u'SF')

@firestore.transactional
def update_in_transaction(transaction, city_ref):
    snapshot = city_ref.get(transaction=transaction)
    transaction.update(city_ref, {
        u'population': snapshot.get(u'population') + 1
    })

update_in_transaction(transaction, city_ref)

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

Изменить для более подробной информации: на самом деле я хотел только проверить, существует ли этот документ или нет, поэтому я могу предотвратить добавление дубликатов в мою транзакцию. если я делаю это вне моей транзакции, которую я уже сделал. это не работает.

например, если я запускаю транзакцию с двух компьютеров одновременно, в конце концов я получаю дубликаты документов в моей коллекции с одинаковыми field_name и field_value. Я думал, что смогу решить эту проблему с помощью запроса в транзакции и возврата из транзакции, если у меня уже был этот документ.

так как Дуг Стивенсон сказал, что это невозможно, так что мне любопытно, почему именно такое ограничение делает невозможным использование этой функции в пожарном депо? это невозможно в базах данных SQL тоже? запрашивает ли транзакция нарушение важного правила или чего-то еще?

1 Ответ

0 голосов
/ 01 июля 2018

Похоже, что вы пытаетесь выполнить запрос внутри транзакции, чтобы найти документы, по которым вы хотите совершить сделку. Это невозможно в Firestore. Вы должны точно знать, какие документы вы хотите в транзакции, заблаговременно.

Вероятно, вам следует сначала запросить документы, поля которых соответствуют вашим требованиям, собрать эти ссылки на документы в массив, а затем выполнить итерацию этого массива в обработчике транзакций, чтобы внести в них необходимые изменения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...