Как обновить идентификатор документа в firebase firestore?

в моей базе данных firestore я сделал адрес электронной почты пользователя в качестве ключа документа. Сделайте, если я хочу, чтобы я сделал db.collection('users').doc('email_id'), чтобы выполнить какое-то действие. Теперь проблема в том, что когда пользователь обновляет свой электронный идентификатор, я не нахожу способа обновить document id в firestore.

Я пытался сделать

db.collection('users').doc(old_email).update({
  id: new_email
})

Но это фактически создало новое поле с именем id с новым адресом электронной почты в качестве значения внутри этого документа вместо обновления фактического document id, чтобы я мог передать его в doc() и получить те же данные о пользователе.

кто нибудь знает как это сделать? Если да, поделитесь, пожалуйста.

перед публикацией этого вопроса я проверил документы Google и firestore, но не нашел способа обновить идентификатор документа. Пожалуйста помоги.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
14
0
18 072
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я не думаю, что есть способ изменить идентификатор документа, но даже если есть способ, то, что вы делаете, ужасно неправильно. Идентификатор должен быть уникальным идентификатором, сделайте себе поле идентификатора пользователя, например, с помощью Firebase Auth используйте firebase.Auth().currentUser.uid в качестве идентификатора ваших сохраненных данных пользователя в Firestore.

Я предлагаю вам изменить то, что в целом решает вашу проблему и, что более важно, дает вам прочную структуру. (UID из Auth уникален)

Ну, я сделал идентификатор электронной почты идентификатором документа, потому что я хотел, чтобы он был уникальным и не дублировался. Итак, вы говорите, что это невозможно сделать?

iSaumya 31.08.2018 13:39

@iSaumya Дело в том, что электронная почта может измениться, и у вас есть масса дополнительной работы, чтобы обойти это. Идентификатор пользователя уникален и не подлежит изменению. Я не проводил исследований о том, возможно ли это сделать, но наличие ключа, который может измениться, уже является плохой практикой, и я не думаю, что у Firebase есть обходной путь для этого.

Badgy 31.08.2018 13:41

спасибо за внимание. Я думаю, мне нужно исправить свой код и использовать идентификатор аутентификации в качестве документа.

iSaumya 31.08.2018 13:42

@iSaumya Да, у меня также есть несколько проектов с Firebase, и использование UID с данными, связанными с пользователем, просто лучшее. Поскольку считывание данных вошедших в систему пользователей не является проблемой, потому что вы можете получить uid так же просто, как электронное письмо, кроме того, любые данные Auth, которые пользователь изменяет, не влияют на идентификатор, поэтому вам не нужно менять какие-либо дополнительные данные. Кстати, если вы действительно хотите использовать электронную почту, вам придется скопировать документ пользователя во временную переменную, удалить документ и создать новый документ с новым адресом электронной почты в качестве ключа, а затем вставить в него старый документ, но как Вы видите, что это просто ненужная работа.

Badgy 31.08.2018 13:46

У меня есть еще один вопрос, который не входит в объем этого вопроса, но все еще задается в надежде, что вы можете помочь. Документ Firestore сказал, что лучше добавить метку времени в качестве поля, поскольку она будет сортировать документы на основе этого. Речь идет о Date.now() или еще о чем-то? См. Важное примечание: firebase.google.com/docs/firestore/manage-data/…

iSaumya 31.08.2018 13:54

@iSaumya Я думаю, это относится к тому факту, что в старой БД Realtime документы можно было сортировать по идентификатору, чего нет в новой БД Firestore, If you want to be able to order your documents by creation date = если вы думаете, что вам нужно будет заказать ваши документы по дате создания, тогда разумно добавить поле отметки времени, иначе оно вам не понадобится. Имейте в виду, что если вы хотите упорядочить пользователей по дате создания, вы можете просто использовать дату создания из проверки подлинности Firebase.

Badgy 31.08.2018 13:58

И если мне нужно, я могу добавить метку времени с Date.now() правильно? Не нужно требовать firebase-admin

iSaumya 31.08.2018 14:01

@iSaumya Да, просто сохраните его как дополнительное поле при установке / добавлении нового документа. Имейте в виду, что Date.now() возвращает только количество миллисекунд с 1970 года, поэтому вы не можете правильно сохранить его в поле типа даты в своей БД. Просто погуглите, как получить хороший формат даты в Javascript.

Badgy 31.08.2018 14:08

Нет ни API для изменения идентификатора существующего документа, ни API для перемещения документа. Если вы хотите сохранить то же содержимое в другом документе, вам необходимо:

  1. Прочтите документ с его существующего ключа.
  2. Запишите документ под новым ключом.
  3. Удалите документ под его старым ключом.

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

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

joshwcorbett 27.04.2020 09:37

Другое решение, которое я реализовал, - это два разных идентификатора документа (documentID и documendUID). DocumentUID используется в запросах и может быть изменен по мере необходимости (используется как поле в документе), а другой documentID не изменяется и в основном используется для определения самого документа. Я также создал документ «перевод», который имеет documentUID в качестве идентификатора документа и имеет как documentID, так и documentUID в качестве полей. Я использую это для запросов на перевод для documentUID, и если мне нужно сослаться на documentID, я могу просто прочитать этот документ.

Brian Begun 04.09.2020 02:14

Звучит как основа для отличного ответа @BrianBegun :)

Frank van Puffelen 04.09.2020 02:56

Другие вопросы по теме