#python #firebase #google-cloud-firestore #transactions
#python #firebase #google-облако-firestore #транзакции
Вопрос:
Я пытаюсь «переместить» документ из одной коллекции в другую в Firestore. Это означает копирование / вставку документа, а затем удаление оригинала. Я пытаюсь добиться этого на стороне сервера с помощью Python.
Я знаю, что использование транзакций может помочь, но мне интересно, почему я не мог просто использовать basic : .get() .set() и .удалить() для этого? Из-за другого потока, поступающего с другого компьютера и изменяющего документ при его перемещении? В моем случае это маловероятно.
И тогда еще один вопрос: почему транзакция, а не пакет? Поскольку я копирую / вставляю документ, означает ли это, что я его читаю?
Последний момент: у кого-нибудь есть лучший пример, чем пример из документов?
Ответ №1:
Вы лучше всех понимаете, что именно вам нужно.
В качестве общего ответа вам понадобится транзакция, потому что:
- Если вы не используете транзакцию, кто-то может прочитать новый документ и исходный документ в операции. Поскольку вы хотите эмулировать операцию перемещения, должен существовать только исходный ИЛИ целевой документ, а не оба из них.
- Пользователь может изменить исходный документ после того, как ваш код прочитал его, но когда он еще не написал его. В этом сценарии транзакция должна завершиться неудачно и перечитайте исходный документ.
- Пакет не будет работать по той же причине: вам нужно прочитать содержимое исходного документа, чтобы записать его в пункт назначения. Вы могли бы сделать это с
get()
помощью внешней транзакции, но тогда кто-то может ее изменить, и ваша транзакция этого не обнаружит (поскольку она проверяет только документы, которые вы читаете внутри транзакции).
Но у вас может быть особый случай, когда ни одна из вышеперечисленных проблем не может быть применена, и в этом случае: сделайте для этого. Однако, как правило, для этого требуется транзакция.
Комментарии:
1. Прекрасно понял. Мне действительно нужна транзакция! С технической точки зрения: нужно ли мне передавать ссылки на 2 документа в транзакцию, чтобы это было сделано?
2. Отредактировал мой вопрос, чтобы добавить некоторый код. Это работает, но я что-то пропустил в транзакции?
3. Это редактирование значительно меняет вопрос. Я рекомендую отменить редактирование, открыть новый вопрос для кода и задать конкретный вопрос там. на «я что-то пропустил» и «я не уверен» действительно сложно ответить. Но если вы можете сказать что-то ближе к «Я думаю, что нужно сделать abc, но ожидал, что это будет xyz», мы, как правило, сможем помочь лучше.
Ответ №2:
<p>fireStor_ins.collection("co1")<br />.document("doc1")<br />.get()<br />.addOnSuccessListener { doc -amp;><br />if (doc.exists()) {</p>
<p>amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp; fireStor_ins.collection("co1")<br />amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp; .document("doc2")<br />amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp; .set(mapOf( "var_1__dc2" to doc["var_1__dc1"],<br />amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp; "var_1__dc2" to doc["var_2__dc1"]<br />amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp; ))<br />amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp; }<br />}</p>