首页 > 解决方案 > 如何更新不同集合中的多个文档 Firestore 文档

问题描述

我正在尝试制作一个消息传递应用程序,您使用 Firebase 创建一个包含电子邮件和密码的帐户,一旦您访问该应用程序,您可以选择是否要添加个人资料图片,这也会将您的详细信息保存在一个名为“appUsers”的集合中,这工作正常,图像的 url 被添加到“appUsers”中,其中包含所有已注册该应用程序的用户

第二部分是当用户想要保存新联系人时,他们输入新联系人的姓名和电子邮件名为“myContacts”的集合,一切正常,

我的问题是,当您更改个人资料图片时,它会在“appUsers”中更新它,但我不知道如何在保存我的详细信息的每个集合中更新该新图片网址有谁知道如何解决这个问题?

// checks if user exists, if they do save them into your own list
static func addContact(email: String, names : String, userUid : String ,com : @escaping () -> ()) {
    guard let currentEmail = Auth.auth().currentUser?.email else {return}
    let refrence = Firestore.firestore().collection("appUsers")
    
    refrence.whereField("email", isEqualTo: email).getDocuments { (snapshot, Error) in
        if let er = Error {
            print(er)
        } else {
            guard  let snap  = snapshot else {return}
            
            for snap in snap.documents {
                let data = snap.data()
                
                let myContacts = db.collection("contacts_for\(currentEmail)").document().collection("details")
                myContacts.addDocument(data: data).updateData(["names" : names])
                
            }
        }
    }
}

// This function is called if you wish to update your profile image and update the collection which holds all users
static func updateimageUrl(data: Data, currentUid : String, completion : @escaping () -> ()) {
    let imageRef = Storage.storage().reference(withPath: "profileImage\(currentUid)")
    
    imageRef.putData(data, metadata: nil) { (meta , error) in
        if let error = error {
            print(error.localizedDescription)
            return
        }
        
        imageRef.downloadURL { (URL, Error) in
            
            guard let url = URL?.absoluteString else {return}
            let refrence = db.collection("appUsers").document(currentUid)
            
            refrence.setData(["profileImage" : url], merge: true) { (Error) in
                if let er = error {
                    print(er)
                } else {
                    completion()
                }
            }
        }
    }
}

我对 iOS 非常陌生,之前从未使用过 Firestore,因此我们将不胜感激

标签: iosswiftfirebasegoogle-cloud-firestore

解决方案


如果要更新多个文档,但不知道它们是什么,则必须:

  1. 查询文档的每个集合(可能使用您要更改的旧 URL
  2. 迭代每个查询的结果集
  3. 单独更新每个文档以包含新值

如果此任务过于繁琐,您可能需要考虑不要像现在这样复制数据。这是一种折衷——要么在需要时执行额外的查询以从单个文档中读取,要么在需要更改时执行多次更新以查找每个重复项。


推荐阅读