我有一个使用Cloud Firestore的iOS应用,但在更新数据方面存在问题。我的目标是逐个将URL添加到字典中,但我得到的只是重写了一个值。我应该如何使用setData和updateData?尝试了不同的方式
storageRef.child("users/" + currentUser.value!.documentID + "/" + faceRef.documentID + ".jpg")
.putData(data!).observe(.success) { (snapshot) in
guard let downloadURL = snapshot.metadata?.downloadURL()?.absoluteString else { return }
let db = self.fsReference.document(self.currentUser.value!.documentID)
var dict = ["faces": ["": ""]]
dict["faces"] = ["newvalue\(downloadURL.hashValue)": downloadURL]
db.updateData(dict)
completion?()
这是我尝试过的。任何建议都会很好,提前谢谢!
UPD:试图将我的字典移动到子集合,但是在.collection("newCollection").document("newdocument")
集合没有出现之后。可能是什么问题?
答案 0 :(得分:1)
所以我看到的是您正在使用云存储来保存个人资料图片,并且想要保存这些图片的每个网址。您需要了解 setValue()和 updateValue()都差不多。带有updateValue()的注释是它将创建该文档(如果尚不存在)。因此,在Firestore中更新值时,请了解它会将值设置为您提供的值,这一开始可能会引起误解。
1st在更新任何文档时,请先获取文档。如果人们不断更新其他文档,则您可能需要考虑使用Firestore交易:https://firebase.google.com/docs/firestore/manage-data/transactions#transactions 这将确保您的数据正确更新。
2nd将URL附加到数组的后面,我不是您设置它的方式,但是我将设置Firestore看起来像这样
"users" = [
"unique_id = "{
"firstname": "John",
"lastname": "Doe",
"unique_id": "document_id_here"
"faces": [ {key: value} ]
}
]
序列化该对象时,您的面孔对象应为 [[String:Any]]
第三步,最后一步是获取文档并更新该值
// Get the value in the completion with the data use this code
// Drill down to the property you want to update using the completion data ex.
var faces = completedData.faces
faces.append("[key: value]")
// Update the data back to firestore
let path = Firestore.firestore().collection("users").document("unique_user_id")
// Merging is so important. otherwise it will override your document
path.setData(["facesKey: faces"], merge: true) {(error in
if let error = error {
// good error handling here
}
// Successfully updated document
)}