【问题标题】:How to update the document ID in firebase firestore? [duplicate]如何更新 Firebase Firestore 中的文档 ID? [复制]
【发布时间】:2019-02-06 10:26:57
【问题描述】:

在我的 firestore 数据库中,我将用户的电子邮件作为文档键。如果我想我可以做db.collection('users').doc('email_id') 来执行一些操作。现在的问题是当用户更新他们的电子邮件 ID 时,我没有找到任何方法来更新 firestore 中的 document id

我试过了

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

但这实际上创建了一个名为 id 的新字段,并将新电子邮件作为该文档中的值,而不是更新实际的 document id,以便我可以在 doc() 中传递它并获取有关用户的相同数据。

有人知道怎么做吗?如果是这样,请分享。

在发布此问题之前,我已经检查了 google 和 firestore 文档,但没有找到任何更新文档 ID 的方法。请帮忙。

【问题讨论】:

    标签: javascript firebase vue.js google-cloud-firestore


    【解决方案1】:

    我认为没有办法更改文档 ID,但即使有办法,你所做的也是非常错误的。 ID 应该是唯一标识符,让自己成为 UserID 字段,例如使用 Firebase Auth 使用 firebase.Auth().currentUser.uid 作为您在 Firestore 中用户特定保存数据的 ID。

    我建议您进行总体更改以解决您的问题,更重要的是为您提供坚实的结构。 (来自 Auth 的 UID 是唯一的)

    【讨论】:

    • 好吧,我将电子邮件 ID 设为文档 ID,因为我希望它是唯一的并且不会重复。所以,你是说没有办法做到这一点?
    • @iSaumya 事情是电子邮件可以改变,你有大量的额外工作要做。用户 ID 是唯一的,不会更改。我没有研究是否可以这样做,但是拥有可以更改的密钥已经是不好的做法,我认为 Firebase 没有解决方法。
    • @iSaumya 是的,我也有一些使用 Firebase 的项目,并且将 UID 与用户相关数据一起使用是最好的。因为读取登录用户的数据是没有问题的,因为您可以像电子邮件一样简单地获取 uid,此外,用户更改的任何 Auth 数据都不会影响 ID,因此您不需要更改任何其他内容。顺便说一句,如果您真的想使用电子邮件,那么您必须将用户的文档复制到临时变量中,删除文档并使用新电子邮件作为键创建一个新文档,然后将旧文档粘贴到其中,但作为您会看到它根本不必要的工作。
    • @iSaumya 我认为它指的是在旧的实时数据库中,文档可以通过 ID 进行排序,而在新的 Firestore 数据库中则不是这样,If you want to be able to order your documents by creation date = 如果你认为你将需要为创建日期订购您的文档,然后添加时间戳字段是明智的,否则您将不需要它。请记住,如果您想按创建日期对用户进行排序,您只需使用 Firebase 身份验证中的创建日期
    • @iSaumya 是的,只需在设置/添加新文档时将其存储为额外字段。请记住,Date.now() 仅返回自 1970 年以来的毫秒数,因此您无法将其正确存储在数据库的日期类型字段中。只是谷歌如何在 Javascript 中获得良好的日期格式。
    【解决方案2】:

    没有 API 可以更改现有文档的 ID,也没有 API 可以移动文档。如果您想将相同的内容存储在不同的文档中,您必须:

    1. 从现有密钥中读取文档。
    2. 将文档写入新密钥。
    3. 删除旧密钥下的文档。

    您需要在事务中运行这些操作,以确保操作以原子方式完成。

    【讨论】:

    • 我希望有一个更新现有文档 ID 的选项,但话虽如此,我会接受这个答案。你可以拥有我的updoot
    • 我实施的另一个解决方案是有两个不同的 documentID(documentID 和 documendUID)。 DocumentUID 用于查询,可以根据需要更改(用作文档中的字段),另一个 documentID 不会更改,主要用于定义文档本身。我还创建了一个“翻译”文档,该文档将 documentUID 作为文档的标识符,并将 documentID 和 documentUID 作为字段。我用它来翻译documentUID的请求,如果我需要引用documentID,我可以简单地阅读这个文档。
    • 听起来像是@BrianBegun 一个很好的答案的基础:)
    • 注意:这只会复制文档顶层数据。如果这样做,您将丢失原始文档中的所有子集合。
    猜你喜欢
    • 2018-09-15
    • 1970-01-01
    • 2021-02-05
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 2023-02-10
    • 2019-06-29
    相关资源
    最近更新 更多