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 中删除文档

Firebase 身份验证 swiftui

文档路径SwiftUI中随机生成的Firebase子键

Firebase+SwiftUI。无法转换价值

如何在swift ui中使用autoid将带有字段的新文档添加到firebase集合

获取嵌套数组 Firebase + SwiftUI