首页 > 解决方案 > 从 Firestore 中删除数组项

问题描述

我花了几天的时间研究这个问题,包括各种答案,比如:Firebase Firestore:从文档数组中追加/删除项目, 但无法弄清楚如何真正让它工作。

我有两个结构:

struct TestList : Codable {
    var title : String
    var color: String
    var number: Int
}

struct TestGroup: Codable {
    var items: [TestList]
}

我可以使用以下方法添加数据FieldValue.arrayUnion

@objc func addNewItem() {
        
        let testList = TestList(title: "Testing", color: "blue", number: Int.random(in: 1..<999))
        let docRef = FirestoreReferenceManager.simTest.document("abc")
        docRef.updateData([
            "items" : FieldValue.arrayUnion([["title":testList.title,
                                             "color":testList.color,
                                             "number":testList.number]])
        ])
    }

上述工作如 Firestore 仪表板中所反映:

在此处输入图像描述

但是,如果我尝试删除数组中的一项,它就是行不通的。

@objc func removeItem() {
 let docRef = FirestoreReferenceManager.simTest.document("abc")
        docRef.getDocument { (document, error) in
            do {
                let retrievedTestGroup = try document?.data(as: TestGroup.self)
                let retrievedTestItem = retrievedTestGroup?.items[1]
                guard let itemToRemove = retrievedTestItem else { return }
                docRef.updateData([
                    "items" : FieldValue.arrayUnion([["title" : itemToRemove.title,
                                                      "color" : itemToRemove.color,
                                                      "number" : itemToRemove.number]])
                ]) { error in
                    if let error = error {
                    print("error: \(error)")
                } else {
                    print("successfully deleted")
                }
                }

            } catch {

            }
        }
}

我已将 打印itemToRemove到日志以检查它是否正确。但它只是不会将其从 Firestore 中删除。没有返回错误,但"successfully deleted"已记录。

请注意,上面是测试代码,因为我已经简化了我实际需要的只是为了测试目的,因为我无法让它工作。

关于我在这里做错了什么的任何想法?

标签: swiftgoogle-cloud-firestore

解决方案


您必须使用arrayRemove从数组中删除项目。

@objc func removeItem() {
    let docRef = FirestoreReferenceManager.simTest.document("abc")
    
    docRef.getDocument { (document, error) in
        do {
            let retrievedTestGroup = try document?.data(as: TestGroup.self)
            let retrievedTestItem = retrievedTestGroup?.items[1]
            guard let itemToRemove = retrievedTestItem else { return }
            docRef.updateData([
                "items" : FieldValue.arrayRemove([["title" : itemToRemove.title,
                                                  "color" : itemToRemove.color,
                                                  "number" : itemToRemove.number]])
            ]) { error in
                if let error = error {
                    print("error: \(error)")
                } else {
                    print("successfully deleted")
                }
            }
            
        } catch {
            
        }
    }
}

我遇到过这种简单的方法不起作用的情况,因为该项目是一个复杂的对象,在这种情况下,我首先必须从 Firestore 查询该项目并将该实例插入arrayRemove()以将其删除。

您的方法没有任何副作用的原因是 Firestore 中的数组与 Swift 中的数组不同,它们是数组和集合的混合体。您可以在 Firestore 中使用重复项初始化数组,但不能使用arrayUnion()重复项追加数组。尝试使用附加重复项arrayUnion()将静默失败,例如在您的情况下。


推荐阅读