firebase - SwiftUI Firebase - 如何查询文档然后更新?
问题描述
尝试查询文档,然后在我的 ViewModel 中的函数中更新它。尝试类似下面的方法,但它不起作用。任何意见,将不胜感激!
func addToFruits(name: String) {
db.collection("fruits").whereField("name", isEqualTo: name)
.getDocument()
.limit(to: 1)
.updateData(["fruits": FieldValue.arrayUnion([name])])
}
func addToRoutine(routine: String, habit: String) {
db.collection("routines").whereField("name", isEqualTo: routine).getDocuments() { (querySnapshot, err) in
if let err = err {
print("Error getting documents: \(err)")
} else {
for document in querySnapshot!.documents {
document.updateData(["habits": FieldValue.arrayUnion([habit])])
}
}
}
}
在第一个中,我得到的错误是“'Query' 类型的值没有成员'getDocument'”并且不知道如何解决这个问题。第二个,我得到的错误是“'QueryDocumentSnapshot'类型的值没有成员'updateData'”
解决方案
目前尚不清楚您要更新的内容,但这里有一些快速示例代码,它将读取名为“Steve”的用户并将他的年龄更新为 50。请记住,这将在名为“Steve”的第一个用户中读取并更新他们的年龄——然后当它再次运行时,将阅读下一个史蒂夫等——这可能是你试图做的。
func readUsersAndUpdateTheirAgeTo50() {
let users = self.db.collection("users") //self.db points to *my* firestore
users.whereField("name", isEqualTo: "Steve").limit(to: 1).getDocuments(completion: { querySnapshot, error in
if let err = error {
print(err.localizedDescription)
return
}
guard let docs = querySnapshot?.documents else { return }
for doc in docs {
let docId = doc.documentID
let name = doc.get("name")
print(docId, name)
let ref = doc.reference
ref.updateData(["age": 20])
}
})
}
如果我只想将史蒂夫的所有年龄更新为 50,请取消限制
.limit(to: 1)
请注意,这段代码有点草率,因为限制为 1,我们不需要循环。另请注意,并非每个史蒂夫都是 50 岁,因此应该有其他参数来缩小史蒂夫的范围 - 例如 uid。
推荐阅读
- java - Java 中嵌套循环的最大数量是多少?
- vbscript - VBScript 文件存在时
- c++ - std::regex 无法匹配 char
- background - Applescript:如何在后台“告诉”应用程序?
- python - 为什么两个或多个查询集的联合不能与 forms.ModelMultipleChoiceField 完美配合?
- android - Unity Admob 插件;当您尝试更改“TextMesh.text”时应用程序崩溃
- react-native - React Native:如何将阴影和边框半径应用于视图?
- android - 标签上的 ADB logcat 退出
- php - PHP合并数组并添加一个值
- angular - ASPNETCORE 反向代理将现有应用程序合并到新的 Angular SPA