3

高级:在 Cloud Firestore 中,我有两个集合。fl_contentfl_files。内fl_content,我正在尝试访问fl_files.

详细:在 fl_content 中,每个文档都有一个名为imageUpload. 这是一组 Firebase 文档参考。fl_files(我需要访问的路径。)

这是我对 fl_content 的查询,我在其中访问 imageUpload 参考:

let docRef = Firestore.firestore().collection("fl_content").document(item.id)
docRef.getDocument { (document, error) in
    if let document = document, document.exists {
       let property = document.get("imageUpload")
       print("PROPERTY \(property!)")
    }
}

这会将以下内容打印到控制台:

PROPERTY Optional(<__NSArrayM 0x60000281d530>(
<FIRDocumentReference: 0x600002826220>
)
)

有了这个文档引用数组,我需要访问 fl_files。

这是我遇到麻烦的部分。

尝试:

在 if let 语句中,我尝试通过将属性转换为 DocumentReference 来访问 fl_files。

    let docRef = Firestore.firestore().collection("fl_content").document(item.id)
     docRef.getDocument { (document, error) in
         if let document = document, document.exists {
            let property = document.get("imageUpload") as? DocumentReference
            print("PROPERTY \(property!)")
            let test = Firestore.firestore().collection("fl_files").document(property)
         }
     }

无法转换“DocumentReference”类型的值?到预期的参数类型“字符串”

    let docRef = Firestore.firestore().collection("fl_content").document(item.id)
     docRef.getDocument { (document, error) in
         if let document = document, document.exists {
            let property = document.get("imageUpload") as! DocumentReference
            let test = Firestore.firestore().collection("fl_files").document(property[0].documentID)
            print("TEST \(test)")
         }
     }

“DocumentReference”类型的值没有下标

    let docRef = Firestore.firestore().collection("fl_content").document(item.id)
     docRef.getDocument { (document, error) in
         if let document = document, document.exists {
            let property = document.get("imageUpload") as! DocumentReference
            let test = Firestore.firestore().collection("fl_files").document(property.documentID)
            print("TEST \(test)")
         }
     }

无法将类型“__NSArrayM”(0x7fff87c50980)的值转换为“FIRDocumentReference”(0x10f6d87a8)。2020-02-05 12:55:09.225374-0500 数据库 1[87636:7766359] 无法将“__NSArrayM”(0x7fff87c50980)类型的值转换为“FIRDocumentReference”(0x10f6d87a8)。

越来越近!

    let docRef = Firestore.firestore().collection("fl_content").document(item.id)

    docRef.getDocument(completion: { document, error in
        if let err = error {
            print(err.localizedDescription)
            return
        }
        let imageUpload = document?["imageUpload"] as? NSArray ?? [""]
        print("First Object \(imageUpload.firstObject!)")

    })

This prints: First Object <FIRDocumentReference: 0x600001a4f0c0>

以下是两个屏幕截图,可帮助说明 Firestore 数据库的外观。

火库 1

在此处输入图像描述

最终,我需要进入filefl_files 中的字段。如何从 imageUpload 访问它DocumentReference

4

2 回答 2

2

终于明白了,感谢@Jay 和@Emil Gi 的帮助。

“A-HA”时刻来自 Emil Gi 的评论:我只能说,如果你成功获取 DocumentReference 类型的元素,那么它必须有一个 id 属性,你可以通过文档 id 提取和查询集合。

    let imageUploadReference = item.imageUpload.first as? DocumentReference
    let docRef = Firestore.firestore().collection("fl_files").document(imageUploadReference!.documentID)
    docRef.getDocument(completion: { document, error in
        if let err = error {
            print(err.localizedDescription)
            return
        }
        let fileNameField = document?.get("file") as! String

        print("File name from fl_files \(fileNameField)")


    })

一旦我终于可以访问相应的“文件”,将图像的完整 URL 下载到 imageView 就非常简单了。

我感谢您的所有帮助!!!

于 2020-02-06T18:00:18.337 回答
2

下面是一些示例代码,展示了如何读取和打印出任何字段值,以及如何读取 imageUpload 字段(一个数组)并打印出第一个元素的值。

我已经包含了从文档中读取数据的两种方法,因为我相信它回答了问题的两个部分:如何获取数组字段imageUpload然后访问该数组中的第一个元素以及如何获取其中的文件字段的值fl_files。

假设这指向正确的文档:

let docRef = Firestore.firestore().collection("fl_content").document(item.id)

此代码将从所指向的文档中读取两个字段:imageUpload(一个数组)和 fl_id(一个字符串)

docRef.getDocument(completion: { document, error in
    if let err = error {
        print(err.localizedDescription)
        return
    }

    print( document!.data() ) //for testing to see if we are getting the fields

    //how to read an array and access it's elements
    let imageUploadArray = document?["imageUpload"] as? Array ?? [""]
    if let url = imageUploadArray.first {
        print(url)
    }

    //this is also valid for reading the imageUpload field array
    //let anArray = document?.get("imageUpload") as? Array ?? [""]
    //if let url = anArray {
    //    print(url)
    //}

    //how to read a single field, like file within fl_files
    let someId = document?.get("fl_id") as! String //example of reading a field
    print(someId)

})

编辑:

看起来存储在 imageUpload 数组中的对象是引用而不是字符串。作为如何访问它们的示例......这是代码

let refArray = document?.get("imageUpload") as? [DocumentReference] ?? []
for docRef in refArray {
   print(docRef.path) //prints the path to the document at this ref
}
于 2020-02-05T18:42:20.177 回答