我想进行一对一的聊天。每个用户都可以联系其他用户。
Json结构将是:
{
"messages" :
"user1UID_user2UID" : {
auto generated ID : {
"text" : "hello",
"timestamp" : 192564646546,
"name" : "user1"
},
auto generated ID : {
"text" : "hi",
"timestamp" : 192564646554,
"name" : "user2"
}
}
}
当user1连接到应用程序时,他可以看到他所属的每个对话的列表。 假设他已经开始与用户2进行对话,用户3也与他进行了对话。
所以我们会有以下孩子:
user1UID_user2UID
user3UID_user1UID
如何检索User1参与的所有会话?
constructor(db: AngularFireDatabase) {
this.messages= db.list('/messages/' + user1UID + "_" + user2UID); //but I don't know user2UID at this moment
}
我可以制作正则表达式,还是每次关注他时都必须存储会话密钥(某处)?
或者我完全错了,我不会以正确的方式看问题?
答案 0 :(得分:2)
您用于聊天室的关键命名架构是我的答案的变体:http://stackoverflow.com/questions/33540479/best-way-to-manage-chat-channels-in-firebase。这是一个变体,因为你似乎没有按字典顺序排列UID,我推荐。
我提出的所有算法都是为特定用户之间的聊天室生成可重现的,唯一的幂等密钥。虽然这些是数据模型非常重要的属性,但它们并没有神奇地解决其他用例。
与NoSQL数据建模中的情况一样,您必须对数据建模以适应您想要的用例。因此,如果您的应用要求您为每个用户显示聊天室列表,那么您应该在数据模型中包含每个用户的聊天室列表:
if (!System.Windows.Application.Current.Windows.OfType<ButtonListView>().Any())
{
ButtonListViewModel buttonListViewModel = new ButtonListViewModel();
ButtonListView winconfigRole = new ButtonListView();
winconfigRole.DataContext = buttonListViewModel;
winconfigRole.Owner = System.Windows.Application.Current.Windows.OfType<ConfigRole>().FirstOrDefault(); //<--
winconfigRole.Show();
winconfigRole.Topmost = true;
winconfigRole.Focus();
}
现在获取用户的聊天室列表就像阅读userChatRooms
user1UID
user1UID_user2UID
user1UID_user3UID
user2UID
user1UID_user2UID
user1UID_user3UID
user3UID
user1UID_user3UID
一样简单。