【问题标题】:Need to delete null FireStore document, only have FIRDocumentReference需要删除 null FireStore 文档,只有 FIRDocumentReference
【发布时间】:2021-12-28 21:26:46
【问题描述】:

我不确定是什么引发了这个问题 - 我的项目按预期运行。似乎在我的 Firestore 数据库中创建了一个文档,除了 FIRDocumentReference 之外的所有字段都为零,这似乎是一个内存地址。我能够通过对数据库运行查询并将接收结构中的所有字段转换为可选字段然后过滤结果数组中的 nil 值来找到此文档。如果我不将结构的字段转换为可选字段,则会导致查询失败并显示错误消息:"The data couldn't be read because it is missing."

我还可以通过将查询限制为 300 个文档来避免此错误。例如:

citiesRef
    .whereField("population", isGreaterThan: 100)
    .limit(to: 300) 

当我将限制提高到 400(注意:总共大约 2700 个文档。)时,它给了我同样的错误。所以,我的猜测是这个 nil 文档隐藏在文档 300 和 400 之间。

我尝试进入 Firebase 控制台并直接删除该文档,但我无法在控制台中找到这样的文档,即使逐个文档地浏览也是如此。

最好的做法是什么?

【问题讨论】:

  • 当您获取文档引用并对其执行删除时会发生什么情况,例如docRef.delete()
  • 就是这样。看来这解决了问题。

标签: swift firebase google-cloud-firestore


【解决方案1】:

结果证明就像隔离空文档并在其上调用 .delete() 一样简单。一旦我这样做了,我使用 git 将相应的结构及其可选值恢复为非可选(以及反转我必须在其他地方进行的更改)。

如果没有这些修改,查询会出错,我将无法访问文档。这很乏味,但很有效。

【讨论】:

    【解决方案2】:

    我不确定这是否按预期工作,但是,如果我是你,我会在视图中尝试一次,像脚本一样运行。;

    运行检查空字段的查询,如果文档中有一个或多个空字段,我将删除它。

    例如; 运行查询以获取具有多个空值的文档;

    citiesRef.whereField("state", isEqualTo: "CO").whereField("name", isEqualTo: "Denver").getDocuments { (querySnapshot, err) in
        if let err = err {
            print("Error getting documents: \(err)")
        } else {
            for document in querySnapshot!.documents {
                db.collection("cities").document(document.documentID).delete()
            }
        }
    

    【讨论】:

    • 如何在 Swift 中查询 null?我不是在讽刺(我不是 FireStore 专家),我真的在问:在您的示例中,它似乎删除了在成功(非空)查询中找到的所有记录。意思是,只要没有问题,它就会删除您拥有的每条记录。是什么让我错了?
    • 我的问题会触发错误语句,因为非可选值为 null。
    猜你喜欢
    • 2019-12-29
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    相关资源
    最近更新 更多