SwiftUI Firebase - 如何查询文档然后更新?
Posted
技术标签:
【中文标题】SwiftUI Firebase - 如何查询文档然后更新?【英文标题】:SwiftUI Firebase - How to query a document then update? 【发布时间】:2020-06-13 20:15:12 【问题描述】:尝试查询文档,然后在我的 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'”
【问题讨论】:
我不太确定你想在那里做什么 - 如果你正在执行一个查询,你应该期待一个或多个结果,所以使用.getDocuments
是你想要的。见Execute a Query。
请注意,代码也是格式错误的——缺少闭包代码等,因此无法按原样工作。您需要将 .updateData
代码移动到 .getDocuments
函数之后的闭包内(一旦更正)
你能在这里举个例子吗?我尝试了很多不同的东西,但仍然无法让它发挥作用。我已经用我试过的另一个例子更新了上面的内容。试图只找到一个文档并添加到该文档
阅读入门指南Writing Data 对您很有帮助,因为您的要求已涵盖。看看那个链接,看到一个文档没有 updateData 函数,documentReference 有。因此,一旦您知道 documentID 或拥有该文档,您就可以创建对它的引用,然后进行更新。重申在循环中执行此操作将更新 all 的结果。
【参考方案1】:
目前尚不清楚您要更新什么,但这里有一些快速示例代码将读取名为“Steve”的用户并将他的年龄更新为 50。请记住,这将在名为“Steve”的第一个用户中读取' 并更新他们的年龄 - 然后当它再次运行时,将读取 NEXT 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。
【讨论】:
以上是关于SwiftUI Firebase - 如何查询文档然后更新?的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 SwiftUI 从 Firebase / Firestore 中删除文档