我正在尝试使用引用类型将查询写入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>
答案 0 :(得分:1)
这与您要查询引用类型字段的事实无关。问题是您没有正确构建查询。您需要将过滤器链接在一起。每个添加的过滤器都会返回一个新的查询对象,您需要在该新查询的基础上进行构建。
let tableReference = userData.collection("tables").document(table.firebaseID!)
let tableSessionCollection = userData
.collection("activeSessions")
.whereField("tableReference", isEqualTo: tableReference)
tableSessionCollection.addSnapshotListener { (snapshot, error) in
// ...
}