SwiftUI Firebase-如何查询文档然后更新?

时间:2020-06-13 20:15:12

标签: firebase google-cloud-firestore swiftui

尝试查询文档,然后在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'”

1 个答案:

答案 0 :(得分:0)

尚不清楚您要更新的内容,但这是一些快速的示例代码,这些代码将在名为“ 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,所以我们不需要循环。另外请注意,并不是每个Steve都为50,因此应该有其他参数来缩小它的范围,例如uid。