首页 > 解决方案 > 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'”

标签: firebasegoogle-cloud-firestoreswiftui

解决方案


目前尚不清楚您要更新的内容,但这里有一些快速示例代码,它将读取名为“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。


推荐阅读