我创建了如下所示的结构。
`func sendMessage(_ message: Message) {
let document = db.collection("messages")
.document(message.senderId)
.collection(message.receiverId)
.document()
let messageData = ["fromId": message.senderId,
"toId": message.receiverId, "content": message.content,
"timestamp": message.timestamp] as [String : Any]
document.setData(messageData) { error in
if let error = error {
print("ERROR SAVING MESSAGE INTO FIRESTORE \(error.localizedDescription)")
return
}
}
let recipientMessageDocument = db.collection("messages")
.document(message.receiverId)
.collection(message.senderId)
.document()
recipientMessageDocument.setData(messageData) { error in
if let error = error {
print("ERROR SAVING MESSAGE INTO FIRESTORE \(error.localizedDescription)")
return
}
}`
并成功获取消息,如下所示:
`func fetchMessages(_ fromId: String, _ toId: String) {
db.collection("messages")
.document(fromId)
.collection(toId)
.addSnapshotListener { querySnapshot, error in
if let error = error {
print("FAILED TO LISTEM FOR MESSAGES: \(error.localizedDescription)")
return
}
querySnapshot?.documentChanges.forEach({ change in
if change.type == .added {
let data = change.document.data()
DispatchQueue.main.async {
let newMessage = ChatMessage(documentId: change.document.documentID, data: data)
self.messages.append(newMessage)
}
}
})
}`
但是当我想拉出我在下面的图片中圈出的所有receiverId时,我收到“文档不存在”错误。我怎样才能获得这些receiverId?
这就是我尝试获取receiverIds的方法。实际上这个函数是为了获取用户名,但是在函数的开头我无法获取子集合的内容。
`func addReceiverNamesToMessages(for userId: String) { 让组 = DispatchGroup()
db.collection("messages")
.document(userId)
.getDocument { document, error in
if let document = document, document.exists {
if let data = document.data() {
let receiverIds = Array(data.keys)
for receiverId in receiverIds {
group.enter()
self.userProfileService.fetchUserProfile(uid: receiverId) { result in
switch result {
case .success(let profile):
DispatchQueue.main.async {
self.chatUser.append(profile)
}
case .failure:
break
}
group.leave()
}
}
group.notify(queue: .main) {
print("All profiles fetched")
}
}
} else {
print("Document does not exist")
}
}`
您在“消息”下显示的任何文档都不存在。因此,它们不会出现在使用 iOS SDK 对该集合进行的任何查询中。 您仍然可以查询嵌套在这些缺失文档下的子集合,但您必须提前知道(缺失)文档 ID。
请参阅文档:
即使文档的一个或多个祖先不存在,它也可以存在。 例如,路径 /mycoll/mydoc/mysubcoll/mysubdoc 处的文档可以 即使祖先文档 /mycoll/mydoc 不存在,也存在。云端 Firestore 数据查看器将不存在的祖先文档显示为 如下:
- 在集合的文档列表中,不存在的祖先文档的文档 ID 以斜体显示。
- 在不存在的祖先文档的信息面板中,数据查看器指出该文档不存在。
另请参阅: