Firebase Cloud Firestore - Доступ к коллекции из ссылки - PullRequest
2 голосов
/ 04 февраля 2020

Высокий уровень: В Cloud Firestore у меня есть две коллекции. fl_content и fl_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 я пытался доступ к fl_files путем приведения свойства в качестве 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
            print("PROPERTY \(property!)")
            let test = Firestore.firestore().collection("fl_files").document(property)
         }
     }

Не удалось преобразовать значение типа 'DocumentReference?' к ожидаемому типу аргумента 'String'

    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 ..

Firestore 1

enter image description here

В конечном счете, мне нужно добраться до поля file внутри fl_files. Как я могу получить доступ к этому из изображения Upload DocumentReference?

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Вот пример кода, который показывает, как прочитать и распечатать любое из значений полей, а также как прочитать поле imageUpload (массив) и распечатать значение первого элемента.

Я включил оба способа чтения данных из документа, потому что я считаю, что это отвечает на обе части вопроса: как получить поле массива imageUpload , а затем получить доступ к первому элементу в этом массиве и как получить значение file поле в fl_files.

Предполагая, что это указывает на правильный документ:

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

этот код будет читать два поля из документа, на который указывает: imageUpload (массив ) и fl_id (a String)

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
}
0 голосов
/ 06 февраля 2020

Наконец-то получил его, благодаря помощи @Jay и @Emil Gi.

Момент "A-HA" появился из комментария Эмиля Джи: Все, что я могу сказать, это то, что если вы успешно получить элемент типа DocumentReference, тогда у него должно быть свойство 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.

Я ценю всю вашу помощь !!!

...