в облачных транзакциях 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 тоже? запрашивает ли транзакция нарушение важного правила или чего-то еще?