首页 > 解决方案 > 为什么此查询从 Firestore 返回 nil

问题描述

我正在尝试userPosts使用以下数据库结构和查询从我的集合组中获取三个最新文档:

-posts
   -{userID}
      -userPosts
         -{documentID}
            -postTime(Field)

询问:

postQuery = Firestore.firestore()
            .collectionGroup("userPosts")
            .order(by: "postTime", descending: true)
            .limit(to: 3)

用于查询 Firestore 的函数:

func loadPosts() {
    postQuery.getDocuments{ [weak self](querySnapshot, error) in
        self!.q.async{
            var postsTemp = self?.postArray
            for doc in querySnapshot!.documents{
                self?.documents += [doc]
                let post = self!.createPost(doc)
                if(!self!.postArray.contains(post)){
                    postsTemp?.insert(post, at: 0)
                }
                 
                DispatchQueue.main.async {
                    self!.postArray = postsTemp!
                    self!.tableView.reloadData()
                }
            }
        }
    }
}

但是,当我运行它时,由于querySnapshotnil 的事实而出现错误。我不确定为什么会发生这种情况,因为当我将降序更改为 false 时,我得到了一个结果,但顺序与我想要的相反。我觉得这与我的查询有关,但不确定我哪里出错了。

标签: swiftfirebasegoogle-cloud-firestore

解决方案


使用两个值(和 `error)getDocuments调用回调,其中只有一个具有 valuequerySnapshot

您忽略error并假设它querySnapshot有一个值,这不仅会导致您得到错误,而且还会隐藏可能的原因。

我建议遵循 Firestore 文档中关于获取文档的示例中使用的模式:

db.collection("cities").whereField("capital", isEqualTo: true)
    .getDocuments() { (querySnapshot, err) in
        if let err = err {
            print("Error getting documents: \(err)")
        } else {
            for document in querySnapshot!.documents {
                print("\(document.documentID) => \(document.data())")
            }
        }
}

通过记录error你可以看到你的getDocuments()电话出了什么问题。


推荐阅读