有沒有辦法在查詢主集合時將子集合映射到結構中?
我的子集合結構是:
-conversations (collection)
--- "users" : [array of two users]
--- messages (subcollection)
------- "created by": "sender"
------- "date" : timestamp
------- "msg" : "help me guys I'm stuck with this damn chat feature"
我在某處讀到查詢很淺,這意味著您只會獲得正在查詢的集合的欄位,但在查詢第一個集合后,除了嵌套查詢回圈之外,還有另一種方法
func getFilteredConversations(query: String) {
if (user != nil) {
db.collection("conversations").whereField("users", arrayContains: user!.displayName)
.order(by: "createdTime")
.addSnapshotListener { (querySnapshot, error) in
guard let documents = querySnapshot?.documents else {
print("no conversations found")
return
}
//mapping
self.chats = documents.map {(queryDocumentSnapshot) -> Conversation in
let data = queryDocumentSnapshot.data()
let docId = queryDocumentSnapshot.documentID
let users = data["users"] as? [String] ?? [""]
let unreadmsg = data["hasUnreadMessage"] as? Bool ?? false
//MARK: - GET MESSAGES
self.db.collection("conversations").document(docId).collection("messages")
.order(by: "date")
.addSnapshotListener{ (querySnapshot, err) in
guard let documents = querySnapshot?.documents else {
print("no messages found")
return
}
var mensajes = [Message]()
mensajes = documents.map {(queryDocumentSnapshot) -> Message in
let data = queryDocumentSnapshot.data()
let docId = queryDocumentSnapshot.documentID
let createdby = data["created_by"] as? String ?? ""
let msg = data["msg"] as? String ?? ""
let date = data["date"] as? Timestamp ?? Timestamp()
return Message(createdBy: createdby, msg: msg, date: date, id: docId)
}
}
print("Users: \(users)")
return Conversation(id: docId, users: users, messages: mensajes, hasUnreadMessage: unreadmsg)
}
}
}
}
這是模型
struct Conversation: Decodable, Identifiable {
//var id: UUID { person.id }
@DocumentID var id: String? = UUID().uuidString
var users: [String] = [""]
var messages: [Message] = []
var hasUnreadMessage : Bool = false
}
struct Message: Decodable {
var createdBy: String?
var msg: String?
@ServerTimestamp var date : Timestamp?
var id : String?
}
uj5u.com熱心網友回復:
您似乎已經自己找到了答案:Firestore 查詢很淺。在讀取父檔案時無法從子集合中讀取。跨集合查詢的唯一方法是使用集合組查詢,這似乎不適用于此處。
考慮是否值得通過客戶端代碼或在云函式中復制父檔案中對話中的最新訊息。通過這種方式,您可以減少必須閱讀的檔案數量才能將初始訊息顯示給用戶。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/311255.html
標籤:迅速 火力基地 谷歌云firestore 迅捷
