в моей базе данных 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, но не нашел способа обновить идентификатор документа. Пожалуйста помоги.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я не думаю, что есть способ изменить идентификатор документа, но даже если есть способ, то, что вы делаете, ужасно неправильно. Идентификатор должен быть уникальным идентификатором, сделайте себе поле идентификатора пользователя, например, с помощью Firebase Auth используйте firebase.Auth().currentUser.uid в качестве идентификатора ваших сохраненных данных пользователя в Firestore.
Я предлагаю вам изменить то, что в целом решает вашу проблему и, что более важно, дает вам прочную структуру. (UID из Auth уникален)
@iSaumya Дело в том, что электронная почта может измениться, и у вас есть масса дополнительной работы, чтобы обойти это. Идентификатор пользователя уникален и не подлежит изменению. Я не проводил исследований о том, возможно ли это сделать, но наличие ключа, который может измениться, уже является плохой практикой, и я не думаю, что у Firebase есть обходной путь для этого.
спасибо за внимание. Я думаю, мне нужно исправить свой код и использовать идентификатор аутентификации в качестве документа.
@iSaumya Да, у меня также есть несколько проектов с Firebase, и использование UID с данными, связанными с пользователем, просто лучшее. Поскольку считывание данных вошедших в систему пользователей не является проблемой, потому что вы можете получить uid так же просто, как электронное письмо, кроме того, любые данные Auth, которые пользователь изменяет, не влияют на идентификатор, поэтому вам не нужно менять какие-либо дополнительные данные. Кстати, если вы действительно хотите использовать электронную почту, вам придется скопировать документ пользователя во временную переменную, удалить документ и создать новый документ с новым адресом электронной почты в качестве ключа, а затем вставить в него старый документ, но как Вы видите, что это просто ненужная работа.
У меня есть еще один вопрос, который не входит в объем этого вопроса, но все еще задается в надежде, что вы можете помочь. Документ Firestore сказал, что лучше добавить метку времени в качестве поля, поскольку она будет сортировать документы на основе этого. Речь идет о Date.now() или еще о чем-то? См. Важное примечание: firebase.google.com/docs/firestore/manage-data/…
@iSaumya Я думаю, это относится к тому факту, что в старой БД Realtime документы можно было сортировать по идентификатору, чего нет в новой БД Firestore, If you want to be able to order your documents by creation date = если вы думаете, что вам нужно будет заказать ваши документы по дате создания, тогда разумно добавить поле отметки времени, иначе оно вам не понадобится. Имейте в виду, что если вы хотите упорядочить пользователей по дате создания, вы можете просто использовать дату создания из проверки подлинности Firebase.
И если мне нужно, я могу добавить метку времени с Date.now() правильно? Не нужно требовать firebase-admin
@iSaumya Да, просто сохраните его как дополнительное поле при установке / добавлении нового документа. Имейте в виду, что Date.now() возвращает только количество миллисекунд с 1970 года, поэтому вы не можете правильно сохранить его в поле типа даты в своей БД. Просто погуглите, как получить хороший формат даты в Javascript.
Нет ни API для изменения идентификатора существующего документа, ни API для перемещения документа. Если вы хотите сохранить то же содержимое в другом документе, вам необходимо:
Вы захотите запустить эти операции в транзакции, чтобы гарантировать автоматическое выполнение операций.
Я надеялся, что есть возможность обновить существующий идентификатор документа, но с учетом сказанного я соглашусь на этот ответ. Вы можете получить мою прическу
Другое решение, которое я реализовал, - это два разных идентификатора документа (documentID и documendUID). DocumentUID используется в запросах и может быть изменен по мере необходимости (используется как поле в документе), а другой documentID не изменяется и в основном используется для определения самого документа. Я также создал документ «перевод», который имеет documentUID в качестве идентификатора документа и имеет как documentID, так и documentUID в качестве полей. Я использую это для запросов на перевод для documentUID, и если мне нужно сослаться на documentID, я могу просто прочитать этот документ.
Звучит как основа для отличного ответа @BrianBegun :)
Ну, я сделал идентификатор электронной почты идентификатором документа, потому что я хотел, чтобы он был уникальным и не дублировался. Итак, вы говорите, что это невозможно сделать?