【发布时间】:2021-09-25 00:14:48
【问题描述】:
我有一个问题,在哪里以及如何正确保存登录到房间的用户,现在我将它们保存在集合“房间”中,但我将用户保存为参考
func addUserToRoom(room: String, id: String) {
COLLETCTION_ROOMS.document(room).updateData(["members": FieldValue.arrayUnion([COLLETCTION_USERS.document(id)])])
}
但是当我创建房间时,我需要传入一个用户数组
func fetchRooms() {
Firestore.firestore()
.collection("rooms")
.addSnapshotListener { snapshot, _ in
guard let rooms = snapshot?.documents else { return }
self.rooms = rooms.map({ (queryDocumentSnapshot) -> VoiceRoom in
let data = queryDocumentSnapshot.data()
let query = queryDocumentSnapshot.get("members") as? [DocumentReference]
// ======== I'm making a request here, but I don't understand how to save users next
query.map { result in
result.map { user in
let user = user.getDocument { userSnapshot, _ in
let data = userSnapshot?.data()
guard let user = data else { return }
let id = user["id"] as? String ?? ""
let first_name = user["first_name"] as? String ?? ""
let last_name = user["last_name"] as? String ?? ""
let profile = Profile(id: id,
first_name: first_name,
last_name: last_name)
}
}
}
let id = data["id"] as? String ?? ""
let title = data["title"] as? String ?? ""
let description = data["description"] as? String ?? ""
let members = [Profile(id: "1", first_name: "Test1", last_name: "Test1")]
return VoiceRoom(id: id,
title: title,
description: description,
members: members
})
}
}
这就是我的房间和个人资料模型的样子
struct VoiceRoom: Identifiable, Decodable {
var id: String
var title: String
var description: String
var members: [Profile]?
}
struct Profile: Identifiable, Decodable {
var id: String
var first_name: String?
var last_name: String?
}
也许有人可以告诉我,如果我没有正确保存用户,我需要在单独的集合中进行,到目前为止我还没有找到解决方案,我将不胜感激。
【问题讨论】:
-
"登录房间的用户" 你是唯一了解这些实体之间关系的人。而且你没有解释它。
-
您可以将用户的 UID 存储在该房间文档中的数组中。
-
@ElTomato 我在我的数据库中添加了一张图片
-
不幸的是,图像不是很有帮助,而且术语“创建房间”和“保存用户”在没有更多上下文的情况下有点含糊。我想我的问题是;如果您有一个房间文档,并且其中一个字段是存储 userId 的数组,那么将代码中的数据加载到保存数据的类或其他对象有什么问题?在这种情况下,您只是将 uid 加载到带有数组的对象中。不?你能澄清一下这个问题吗?
标签: swift firebase firebase-realtime-database google-cloud-firestore swiftui