Firestore使用带有where子句的引用类型

时间:2019-06-13 14:31:55

标签: ios swift google-cloud-firestore

我正在尝试使用引用类型将查询写入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)
        }
    }
}

根据this问题,一切都应该正常工作。但事实并非如此。 我在函数中放入了一些图片,根据输出,它两次从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 个答案:

答案 0 :(得分:1)

这与您要查询引用类型字段的事实无关。问题是您没有正确构建查询。您需要将过滤器链接在一起。每个添加的过滤器都会返回一个新的查询对象,您需要在该新查询的基础上进行构建。

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

另请参阅:Firestore: Multiple conditional where clauses