Firestore带有数组包含的语句不起作用

时间:2018-11-07 10:22:11

标签: javascript typescript firebase google-cloud-firestore

我检查数据库是否有参考(存在),但没有任何回聊,但看不到哪里。

chat.service.ts:

  getUserChats(): Observable<Chat[]> {
        let uid = '-1';
        this.auth.currUser.subscribe(user => (uid = user.uid));
        this.chats = this.afs
          .collection('chats', ref => ref.where('members', 'array-contains', `users/${uid}`))
          .snapshotChanges()
          .pipe(
            map(actions => {
              return actions.map(action => {
                const data = action.payload.doc.data() as Chat;
                const id = action.payload.doc.id;
                return {id, ...data};
              });
            })
          ) as Observable<Chat[]>;
        return this.chats;
      }

该代码旨在获取所有登录用户所在的聊天室。我通过检查members数组(如果有对他的引用)来进行此操作。

chat.component.ts:

chats: Observable<Chat[]>;
  constructor(private router: Router, public chatService: ChatService, public dialog: MatDialog, public auth: AuthService) { }

  ngOnInit() {
    this.chats = this.chatService.getUserChats();
  }

chat.component.html:

<mat-list-option *ngFor="let chat of chats | async" (click)="handleClick(chatList)" [value]="chat.id">
        <img matListAvatar src="./assets/avatar.svg" alt="Avatar Icon">
        <h3 mat-line>{{chat.name}}</h3>
        <p mat-line>test</p>
      </mat-list-option>

聊天结构:

model

3 个答案:

答案 0 :(得分:1)

显然,您正在查询存储在数据库中的users/uid/users/uid,请参阅第一个/

答案 1 :(得分:0)

我认为您是在服务器从Observable复出之前从服务返回“ this.chat”的。 您需要返回可观察者自己。 尝试此更改:

getUserChats(): Observable < Chat[] > {
    let uid = '-1';
    this.auth.currUser.subscribe(user => (
            uid = user.uid;

            //that what you need to return
            return this.afs
                .collection('chats', ref => ref.where('members', 'array- 
                        contains ', `users/${uid}`))
                        .snapshotChanges()
                        .pipe(
                            map(actions => {
                                return actions.map(action => {
                                    const data = action.payload.doc.data() as Chat;
                                    const id = action.payload.doc.id;
                                    return { id,...data   };
                                });
                            })
                        ) as Observable < Chat[] > ;

                    }

                ));

每个Observable都需要订阅-但在角度上异步管道可以满足您的需求-因此您只需将其传递给Observable。

我编辑我的答案-现在查询等待用户auth的答案

答案 2 :(得分:0)

将立即搜索值-1,因为我没有等待用户可观察到的对象完成,这就是为什么它搜索-1却什么都没找到的原因,所以我必须等待用户可观察到的对象。仍然不知道该如何返回内部的可观察对象。