【问题标题】:Firestore - Creating multiple documents at once using Int value from querySnaphotFirestore - 使用 querySnaphot 中的 Int 值一次创建多个文档
【发布时间】:2018-11-22 09:41:10
【问题描述】:

目前我已经做到了,当用户点击一个按钮时,FirstCollection 中的所有文档都会被复制到一个名为 SecondCollection 的集合中,效果很好!

我现在想做的是在新创建的名为 SecondCollection 的集合中的所有文档中使用字段 (numberValue) 中的 Int 值。然后使用这些值在文档的名为“SecondSubCollection”的子集合中创建多个文档。

例如,如果 numberValue 在一个文档中为 3,我想执行批处理请求并在文档的名为“SecondSubCollection”的子集合下创建 3 个文档。然后通过一个请求对 SecondCollection 中的所有文档执行此操作。

请参阅下面的代码,了解我目前所获得的内容。在我按下按钮的那一刻,它只在每个子集合中创建一个文档,这并没有按照我想要的方式工作。我想让它创建多个文档(如果文档中的 numberValue 为 3,它应该在文档的子集合中创建 3 个文档)。

希望这更有意义!任何帮助将不胜感激,谢谢!

代码

@IBAction func goButton(_ sender: UIButton) {

    let userRef = db.collection("Users").document(user!)

    userRef.collection("SecondCollection").document(firstID).setData(["name" : "name"]) {
        error in

        if let error = error {
            print("Error adding document: \(error.localizedDescription)")
        } else {
            print("Document added with ID")
        }
    }

    let firstRef = userRef.collection("FirstCollection")

    firstRef.getDocuments { (querySnapshot, err) in
        if let err = err {
            print("Error getting documents: \(err)")
        } else {
            if let snapshot = querySnapshot {
                for document in snapshot.documents {
                    let data = document.data()
                    let name = data["name"] as? String ?? ""
                    let numberValue = data["numberValue"] as? Int ?? Int()
                    let batch = self.db.batch()
                    let docset = querySnapshot

                    let integerArray = [Int](1...numberValue)

                    let secondID = UUID().uuidString

                    let secondRef = userRef.collection("SecondCollection").document(secondID)

                    docset?.documents.forEach {_ in batch.setData(["name" : name, "numberValue" : numberValue], forDocument: secondRef)}

                    \\ the code that isn't working properly at the moment
                    let secondSubRef = secondRef.collection("SecondSubCollection").document()
                    docset?.documents.forEach {integerArray in batch.setData(["value" : Int], forDocument: secondSubRef)}


                    batch.commit(completion: { (error) in
                        if let error = error {
                            print("\(error)")
                        } else {
                            print("success")
                        }
                    })
                }
            }
        }
    }
}

目前正在做什么

  1. FirstCollection

    • 文档 ID。
      • 姓名:姓名。
      • 数字值:3。
    • 文档 ID。
      • 姓名:姓名。
      • 数字值:2。
  2. SecondCollection

    • 文档 ID。
      • 姓名:姓名。
      • 数字值:3。
      • SecondSubCollection
        • 文档 ID。
          • 值:1。
    • 文档 ID。
      • 姓名:姓名。
      • 数字值:2。
      • SecondSubCollection
        • 文档 ID。
          • 值:1。

我想做的事

  1. FirstCollection

    • 文档 ID。
      • 姓名:姓名。
      • 数字值:3。
    • 文档 ID。
      • 姓名:姓名。
      • 数字值:2。
  2. SecondCollection

    • 文档 ID。
      • 姓名:姓名。
      • 数字值:3。
      • SecondSubCollection
        • 文档 ID。
          • 值:1。
        • 文档 ID。
          • 值:2。
        • 文档 ID。
          • 值:3。
    • 文档 ID。
      • 姓名:姓名。
      • 数字值:2。
      • SecondSubCollection
        • 文档 ID。
          • 值:1。
        • 文档 ID。
          • 值:2。

【问题讨论】:

  • 问题不清楚;您可以更新问题以指出您遇到困难的代码部分吗?什么不工作?您能否阐明使用该数组创建多个文档 的含义?请记住,您了解您的项目,我们不了解,因此您在描述问题时必须非常具体。请查看以下关于提问的指南:How to create a Minimal, Complete, and Verifiable example
  • 您好杰,非常感谢您的反馈。请参阅修订后的更改。希望现在一切都说得通了。如果您能帮我解决这个问题,我将不胜感激,谢谢!
  • 如果不深入挖掘,我首先想到的是您正在编写自上而下的代码,这对于 Firebase 并不适用。调用是异步的,尝试访问闭包之外的快照和数据可能会产生间歇性结果。这行 firstRef.getDocuments 实际上可能在 SecondCollection 可以写入 name:name 之前被调用。在这种情况下,这可能不是一个大问题,但需要注意并相应地编写代码。
  • 另一件事是,编写 SecondSubCollection 的代码似乎覆盖了文档节点名称,因此您只能获得一个节点。检查 secondSubRef 变量。 (我可能错了,如果是,请告诉我,我将删除此评论)
  • 嗨杰,通过您的帮助我找到了解决方案,如果您有兴趣,请查看我的回答...再次感谢您的帮助,非常感谢! ??????

标签: swift firebase foreach google-cloud-firestore


【解决方案1】:

这是我的工作(简化)解决方案:(非常感谢 Jay 的巨大帮助!)

@IBAction func goButton(_ sender: UIButton) {

    let userRef = db.collection("Users").document(user!)

    let array = [1, 2, 3]

    array.forEach { number in

        let batch = self.db.batch()

        let docRef = userRef.collection("FirstCollection").document()

        batch.setData(["numberValue" : number], forDocument: docRef)

    }

    batch.commit(completion: { (error) in
        if let error = error {
            print("\(error)")
        } else {
            print("success")
        }
    })
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-19
    • 2022-01-22
    • 1970-01-01
    • 2018-08-24
    • 2018-07-08
    • 2021-01-05
    相关资源
    最近更新 更多