【问题标题】:SwiftUI Firebase - How to query a document then update?SwiftUI Firebase - 如何查询文档然后更新?
【发布时间】: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 的结果。

标签: firebase google-cloud-firestore swiftui


【解决方案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。

【讨论】:

    猜你喜欢
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 2019-09-06
    • 2019-10-06
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多