Firestore использовать ссылочный тип с предложением where - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь написать запрос в Firestore, используя ссылочный тип.Я проверил документацию и некоторые вопросы по SO, но не понял, как использовать ссылки в тех или иных условиях.Я понимаю, что поле ссылки может помочь мне получить документ, на который оно ссылается, потому что ссылка - это путь.У меня есть структура один к одному, и я хотел бы получить документы по ее ссылке в «обратном» направлении.В то же время у меня есть другие таблицы со структурой один ко многим.И я хочу использовать тот же подход с ними.

Вот моя структура.Это один в один.Один документ в коллекции activeSessions должен иметь только один соответствующий документ в коллекции таблиц:

Root collection
    |
    |
    -- tables (collection)
    |   |
    |   |
    |   -- tableName
    |   |
    |   -- tableCapacity
    |
    |
    -- activeSessions (collection)
        |
        |
        -- openTime
        |
        -- tableReference (reference that contains path to one of tables document.)

Поэтому я хотел бы получить документ из коллекции activeSessions, в котором есть ссылка на документ, который у меня уже есть.Я попробовал следующую функцию, но она возвращает документ для любого табличного документа.

class func getActiveSession (forTable table: TablesTable, completion: @escaping (TableSessionTable?, Error?) -> Void) {
    // table.firebaseID contains unique id of the table document.
    // let userData = appDelegate.db.collection("usersData").document(userId)
    let tableReference = userData.collection("tables").document(table.firebaseID!)
    print(table.firebaseID)
    print (tableReference)
    let tableSessionCollection = userData.collection("activeSessions")
    tableSessionCollection.whereField("tableReference", isEqualTo: tableReference)
    tableSessionCollection.addSnapshotListener { (snapshot, error) in
        if let error = error {
            completion(nil, error)
            return
        }

        if let snapshot = snapshot {

            let ref = data["tableReference"] as! DocumentReference
            print("tablesession reference is to \(ref.documentID)")
            print(ref)
            completion(tableSession, error)
        }
    }
}

В соответствии с этим вопросом все должно работать нормально.Но это не так.Я поместил несколько отпечатков в свою функцию, и в соответствии с выводом он возвращает один документ из запроса tableSession два раза.Это ссылки на один и тот же documentID.Но в то же время экземпляры объекта DocumentReference различны:

Optional("12tVcpi93aPbN8qWmtLx")
<FIRDocumentReference: 0x6000011e76e0>
Optional("s7FCXMlCdx61OmtHyQvy")
<FIRDocumentReference: 0x6000011e5b60>

tablesession reference is to s7FCXMlCdx61OmtHyQvy
<FIRDocumentReference: 0x6000011e3600>

tablesession reference is to s7FCXMlCdx61OmtHyQvy
<FIRDocumentReference: 0x60000119b4c0>

1 Ответ

1 голос
/ 13 июня 2019

Это не имеет ничего общего с тем, что вы запрашиваете поле ссылочного типа.Проблема в том, что вы неправильно строите запрос.Вам нужно объединить фильтры в цепочку.Каждый добавленный фильтр возвращает новый объект запроса, и вам необходимо создать этот новый запрос.

let tableReference = userData.collection("tables").document(table.firebaseID!)
let tableSessionCollection = userData
    .collection("activeSessions")
    .whereField("tableReference", isEqualTo: tableReference)
tableSessionCollection.addSnapshotListener { (snapshot, error) in
    // ...
}

См. Также: Firestore: несколько условных выражений where

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...