【问题标题】:Adding a custom object to an array in Firestore将自定义对象添加到 Firestore 中的数组
【发布时间】:2020-12-28 04:05:13
【问题描述】:

我正在制作一个订购应用程序,供客户订购他们的特定规格。当用户登录时,他们可以转到一个包含所有规格的表格视图的选项卡,一旦他们单击一个单元格,它将带他们到一个新的视图控制器,该控制器将显示有关规格的更多信息。一旦在此视图控制器上,他们将能够添加该项目的 x 数量的托盘/卷/等。我可以将规范添加到 Firestore,但我无法将它添加到我需要的 Firestore 中的数组中。我的目标是,在另一个选项卡上,用户可以查看他们尝试订购的所有当前规格,直到他们点击提交。我目前正在使用 user.uid 来获取 Firestore 内的特定客户订单。

代码: @IBAction func addPallet(_ sender: Any) {

    // Get the current user
    let user = Auth.auth().currentUser
    if let user = user {
        _ = user.uid
    }
    
    if spec != nil {
        
        // Get the qty ordered for that spec
        let totalQty: Int? = Int(palletsToAddTextField.text!)
        let qty = spec!.palletCount * totalQty!
        
        let specToAdd = Spec(specNumber: spec!.specNumber,
                        specDescription: spec!.specDescription,
                        palletCount: spec!.palletCount,
                        palletsOrdered: qty)

        orderedArray.append(specToAdd)
        
        let specAdded: [String: Any] = [
            "SpecDesc": spec!.specDescription,
            "SpecNum": spec!.specNumber,
            "PalletCount": spec!.palletCount,
            "PalletsOrder": qty
        ]
        
        
        
        db.collection("orders").document(user?.uid ?? "error").setData(specAdded) { err in
            if let err = err {
                print("Error writing document: \(err)")
            } else {
                print("Document successfully written!")
            }
        }
        
    }
    
}

规范代码: 结构规范:可编码 {

// Properties
var specNumber: String
var specDescription: String
var palletCount: Int
var palletsOrdered = 0

enum CodingKeys: String, CodingKey {
    case specNumber
    case specDescription
    case palletCount
    case palletsOrdered
}

}

我需要添加如下图所示的内容。用户将添加 x 个托盘,然后转到他们想要的下一个规范并将其添加到 Firestore 中的数组中。

【问题讨论】:

  • 您必须将规范字段(在数据库中)视为一个数组。要将元素附加到 Firestore 中的数组,您必须获取数组,解包,将元素添加到其中,然后使用新数组更新文档,或者使用 arrayUnion 附加元素而无需先读取它。 firebase.google.com/docs/firestore/manage-data/…
  • Firestore 中的数组的工作方式与您在 iOS 中习惯的略有不同。例如,如果您只使用arrayUnion,则该数组将永远不会包含重复项(从这个意义上说,它的操作更像是一个集合而不是一个数组,这很有用)。但是,如果您直接编写包含重复项的数组(不使用arrayUnion),则这些重复项将保留。阅读此书作为入门读物:firebase.googleblog.com/2018/08/…

标签: ios swift firebase google-cloud-firestore swift5


【解决方案1】:

好吧,我想我得到了你想要做的。试试:

db.collection("orders").document(userID).setData(["allMyData" : myArray])

"allMyData" 将是您要保存数组的字段的名称,而 myArray 将是您的数组 (specAdded)。这就是你要找的东西?

如果文档已经存在,您将希望使用 .updateData 而不是 .setData 来保留该特定文档中可能已经存在的所有其他字段。

亲切的问候

【讨论】:

  • 谢谢,它接近我所需要的。我将更新我的问题以显示我到底需要什么。
  • 您的数据库结构对我来说似乎有点奇怪,但这可能有其原因。也许你应该使用更深的顺序。 db.collection("orders").document("userID").collection("specs").document().setData(...) 也可以使用arrayUnion() 或arrayRemove() 但要充分利用firestore 功能我建议改为使用文档和集合 hiereachy。如果我的回答有帮助,请放弃我或点击已解决按钮。
  • 我愿意改变我的数据库结构。我有两个集合(用户和订单),一个用于用户及其规范,另一个用于他们的订单,但在写完之后,我可能应该在每个用户下的用户中包含订单。我的最终目标是每个用户都有自己的规格,并且可以将多个规格添加到订单中,因此每当他们添加带有 x 个托盘的规格时,它都会附加到 Firestore 内的数组中。我也可以只订购规格编号和数量而不是其余数据。
  • 通过查看您的屏幕截图,在我看来,“specs”应该是一个集合,而“0”和“1”将是该集合中的文档。如果你想坚持你的数组,你可以通过 forementionend 数组运算符来做到这一点。祝你好运,希望有所帮助。
  • 我实际上最初是这样设置的,但无法正确获取数据并将它们添加到我的自定义对象中。
猜你喜欢
  • 2018-03-16
  • 1970-01-01
  • 1970-01-01
  • 2020-05-17
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
相关资源
最近更新 更多