【问题标题】:Merge a document with a document from its sub-collection将文档与其子集合中的文档合并
【发布时间】:2018-12-22 14:50:07
【问题描述】:

我在 firestore 下有一个数据库,其结构如下:

-> 聊天室 -> 用户

我有一个包含“用户”集合的“聊天室”集合。在 users 集合中,每个文档都包含“read: true/false”字段,以便了解用户是否已阅读房间中的消息。

要检索当前用户的房间,我使用以下代码:

getRoomFromUserId(userId: string) {
    let rooms$: Observable<any>;
    let rooms: AngularFirestoreCollection<any>;

    rooms = this.afs.collection('ChatRoom', ref => {
      return ref.where('Chatter.' + userId, '==', true);
    });


    rooms$ = rooms.snapshotChanges().map(changes => {
      return changes.map(a => {
        const data = a.payload.doc.data();
        const id = a.payload.doc.id;
        return {id, ...data};
      });
    });

    return rooms$;
 }

为了从“用户”子集合中恢复数据,我使用这行代码:

this.afs.collection('ChatRoom').doc(RoomID).collection('Users').doc(UserId);

我想检索一个包含房间数据和每个房间的“读取:真/假”的对象,我认为可以使用 observables,但我不知道该怎么做。您对解决方案有什么想法吗?

【问题讨论】:

    标签: angular typescript google-cloud-firestore


    【解决方案1】:

    我终于明白了。要将用户子集合链接到房间文档,链接到 combineLatest 操作符的 mergeMap 操作符允许知道相关用户是否阅读了房间消息。

       let rooms: AngularFirestoreCollection<any>;
    
        rooms = this.afs.collection('ChatRoom', ref => {
          return ref.where('Chatter.' + userId, '==', true);
        });
    
        let readRoom$: Observable<any>;
        let readRoom: AngularFirestoreCollection<any>;
    
        return rooms.snapshotChanges().pipe(
          mergeMap(changes => {
            return Observable.combineLatest(changes.map(a => {
              const data = a.payload.doc.data();
              const id = a.payload.doc.id;
              let roomReturn = {id, readMessage: '', photoProfile: '', ...data};
    
              readRoom = this.afs.collection('ChatRoom').doc(id).collection('Users');
              readRoom$ = readRoom.snapshotChanges();
    
              return readRoom$.pipe(
                map(userInRoom => {
                  userInRoom.map(userList => {
                    if (userList.payload.doc.id === userId) {
                      roomReturn.readMessage = userList.payload.doc.data().ReadMessage;
                    } else {
                      roomReturn.photoProfile = userList.payload.doc.data().PhotoProfile;
                    }
                  });
    
                  return roomReturn;
                })
              );
            })
            );
          })
        );

    【讨论】:

      猜你喜欢
      • 2020-12-05
      • 1970-01-01
      • 2018-10-21
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多