如何在 Swift 的 Firebase Firestore 中获取当前文档 ID?

Posted

技术标签:

【中文标题】如何在 Swift 的 Firebase Firestore 中获取当前文档 ID?【英文标题】:How to get current document id in Firebase Firestore in Swift? 【发布时间】:2021-04-29 16:22:12 【问题描述】:

我有这两个文档 ID(我以后还会有更多)

在我的代码的某些部分中,当用户点击表格视图单元格时,我正在使用以下代码更新我的 Firebase:

let dbCollection = K.FStore.db.collection(K.FStore.User.UsersCollectionName).document("EMSce9qnfNnPmn8JBobn")
if let textFieldText = textField.text 
    dbCollection.updateData([
        self.userDataInsideTableViewKeysArray[indexPath.row] as! String : textFieldText
    ]) err in
        if let err = err 
            print("Error updating document: \(err)")

         else 
            print("Document successfully updated")
        
    

我有一个应用程序,当用户使用 firebase 提供的电子邮件和密码身份验证功能注册时,我会创建一个数据库集合,其中包含该唯一电子邮件以及其他一些数据(性别、年龄、电话号码......)文档 ID是随机生成的,如果我在它们之间循环,我可以访问所有文档 ID,但是我想要这个特定文档的文档 ID,以便我可以更新它,我想用 document(documentID) 替换 document("EMSce9qnfNnPmn8JBobn")我有多个用户

【问题讨论】:

1) 您(以及 Firebase 如何)知道需要更新哪些文档? IE。文档中标识用户属于什么? 2)使用用户的UID作为文档ID的用户配置文件是惯用的。我强烈建议您更改数据以执行此操作,在这种情况下,您可以通过以下方式获取当前用户的文档:K.FStore.db.collection(K.FStore.User.UsersCollectionName).document(Auth.auth().currentUser.uid) 感谢您的支持。对于第一个问题,这正是我要问的原因,老实说,我不知道。每个用户的电子邮件地址都是唯一的。我不知道这是否有帮助。至于第二个问题,当我使用 K.FStore.db.collection(K.FStore.User.UsersCollectionName).addDocument(data:["Name" : name ...]) 创建集合时,documentID 是随机生成的,如何将其更改为用户的UID? 2) 请参阅firebase.google.com/docs/firestore/manage-data/… 中的第一个示例,了解如何使用 (setDocument) 自己指定文档 ID。另请参阅***.com/a/60418826 1)如果您知道文档中的某些独特内容,则可以使用查询来查找文档:firebase.google.com/docs/firestore/query-data/… 我在下面的回答中写了一个更冗长的版本。 【参考方案1】:

我不确定我是否理解正确,但如果您想获取当前登录用户的文档,那就是:

K.FStore.db.collection(K.FStore.User.UsersCollectionName).document(Auth.auth().currentUser.uid)

另请参阅getting the currently signed-in user 上的文档。


更新

您似乎已使用 addDocument 调用添加了用户配置文件,这意味着 ID 与用户无关。在这种情况下,您需要知道文档中的某些内容,以唯一标识要更新的文档。

由于您说您的电子邮件地址是唯一的,并且存储在文档中,您可以use a query 查找匹配的文档,然后循环并更新每个文档:

db.collection("cities").whereField("capital", isEqualTo: true)
    .getDocuments()  (querySnapshot, err) in
        if let err = err 
            print("Error getting documents: \(err)")
         else 
            for document in querySnapshot!.documents 
                document.ref.updateData([
                    "fieldToUpdate": "newValue"
                ])
            
        


如果您有一个用户数据集合,其中每个文档属于特定用户,并且每个用户只能拥有一个文档,那么使用 UID 作为文档 ID 是惯用的。要使用 UID 作为文档 ID 创建文档,请参阅 setting a document 上文档中的第一个示例。

如果您使用此数据结构,则无需查询即可找到用户的个人资料文档,而是可以使用顶部的语句来确定要更新的文档。

【讨论】:

嘿,谢谢你的回答,我之前确实试过,但我收到的 ID 是:“4J3kRyPR49euHhozyHHlR06Bfpe2”,它不等同于上述任何文档 ID,所以什么时候做 document(uid)它说找不到文件! 所以这意味着该文档不适用于当前用户,这就是为什么我开始回答时说“如果您想获取当前登录用户的文档”。如果这不是您想要的,那么请编辑您的问题以阐明是什么决定了您要加载的文档。 好的,请阅读此评论,如果您现在明白了,请告诉我,我有一个应用程序,当用户使用 firebase 提供的电子邮件和密码身份验证功能注册时,我会使用该唯一电子邮件创建一个 db 集合连同其他一些数据(性别、年龄、电话号码......)文档 ID 是随机生成的,如果我在它们之间循环,我可以访问所有文档 ID,但是我想要这个特定的文档 ID,以便我可以更新它,我想用 document(documentID) 替换 document("EMSce9qnfNnPmn8JBobn") 因为我有多个用户 感谢您的澄清。 1)请编辑您的问题(下面有一个链接)以准确显示该信息。将其隐藏在此处的评论中,使其他人不太可能看到它。另外,我很有可能会删除我的答案,因为它不再适用于您更新的问题描述。 2) 我强烈建议使用用户的 UID 作为文档 ID,因为这是一种非常惯用的方式,既可以识别每个用户属于哪个文档,又可以确保每个用户只能拥有一个配置文件。 我用你的第二种方法用 UID 创建它,就像一个魅力。现在我的第一次尝试对我来说听起来很愚蠢,哈哈。你每天都在学习新东西,非常感谢!

以上是关于如何在 Swift 的 Firebase Firestore 中获取当前文档 ID?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复:“@angular/fire”'没有导出成员 'AngularFireModule'.ts(2305) ionic、firebase、angular

如何在 Fire Base 中使用完成处理程序

当应用程序关闭时,Rest Api Firebase 通知在 Swift 4 中不起作用

Firebase 存储上传图像不适用于亚马逊火灾(型号:Fire 7)

使用@angular/fire@6.0.3 无法访问firebase.firestore.FieldValue.serverTimestamp()

node_modules/@angular/fire/firebase.app.module.d.ts 中的错误?