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