如何在Firestore文档中更新不同集合中的多个文档

时间:2020-10-01 21:53:37

标签: ios swift firebase google-cloud-firestore

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

第二部分是当用户想要保存新联系人时,他们输入新联系人的姓名,然后使用电子邮件发送电子邮件,我的功能将检查是否有该电子邮件的用户,如果存在,则将保存所选用户的详细信息进入一个名为“ myContacts”的新收藏集,一切正常,

我的问题是,当您更改个人资料图像时,它会在“ appUsers”中对其进行更新,但是我不知道如何在保存了我的详细信息的每个集合中更新新的图像URL 有人知道如何解决吗?

// 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,因此不胜感激

1 个答案:

答案 0 :(得分:0)

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

  1. 在每个集合中查询文档(也许使用您想要更改的旧网址
  2. 迭代每个查询的结果集
  3. 分别更新每个文档以包含新值

如果此任务太繁琐,您可能想像现在一样复制数据。这是一个折衷方案-要么在需要时执行其他查询以从单个文档中读取,要么在需要更改时执行多个更新以查找每个重复项。