[我正在尝试使用angular和firebase创建一对一的聊天,我遵循了我在stackoverflow和firebase文档上看到的一个模型,该模型基本上是collection().doc().collection().add()
我最终得到这样的东西
chats
user1UID
user1UID_user2UID
user1UID_user3UID
user2UID
user1UID_user2UID
user1UID_user3UID
user3UID
user1UID_user3UI
但是由于某些原因,尝试通过uid的路径检索聊天室不起作用,并返回空
return this
.afs.collection('chats')
.doc(uid)
.snapshotChanges()
.pipe(
map(r => {
console.log(r);
})
);
我注意到ID斜体,并且进一步查看它,我发现是这样的,因为文档中没有字段,并且必须手动创建文档才能注册并“不是虚拟的”。尽管我是通过代码创建聊天的。
const dRef = this.afs.collection('chats');
const c = Promise.all([
dRef.doc(uid).collection(`${uid}_${r_id}`).add(data),
dRef.doc(r_id).collection(`${r_id}_${uid}`).add(r_data)
]);
我试图查看是否可以在添加集合时设置'name'之类的字段,但我不认为doc(uid).set({name: 'name'}).collection()
可能会因为设置为承诺而发出警告。任何帮助或指导将不胜感激。请让我知道我在做错什么,如果有可能采用更好和/或优化的方法,我将很高兴欢迎它
更改此:
return this
.afs.collection('chats')
.doc(uid)
.snapshotChanges()
.pipe(
map(r => {
console.log(r);
})
);
进入此:
return this
.afs.collection('chats',ref => ref.where('uid', '==', uid))
.snapshotChanges()
.pipe(
map(r => {
console.log(r);
})
);
在消防站中,您有userChatRooms
,没有chats
如果我对您的理解正确,您正在尝试通过查询来检索用户文档的子集合,这在客户端SDK中是不可能的。 (请参见:How to list subcollections in a Cloud Firestore document和How to list subcollection on firestore?)
您最好的选择是:
更改您的数据模型以将对话列表包含在用户的[[document中]。这样,您可以通过仅阅读本文档来确定对话列表,然后在用户单击其中的一个时阅读必需的集合。
您通常还会在文档中包括有关每个会话的一些主要信息,例如上次更新时间(以便您可以首先显示最近更新的会话),以及每个会话的最后一条消息。do具有列出集合的功能。不过,在这种情况下,我还是建议不要这样做,因为您仍然需要我在另一个选项中提到的每个会话的其他信息。