Как переместить документ между 2 коллекциями в Firebase?

#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>