【问题标题】:Firestore where 'array-contains' query doesn't work with references'array-contains' 查询不适用于引用的 Firestore
【发布时间】:2019-04-11 19:24:58
【问题描述】:

我有一个包含参与聊天的用户的成员数组的集合“聊天”。问题是我想获取当前用户参与的所有聊天。

我用这个查询来做这个:

getUserChats(): Observable<Chat[]> {
    return this.auth.currUser
      .pipe(
        take(1),
        switchMap(user => this.afs
            .collection('chats', ref => ref.where('members', 'array-contains', `/users/${user.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[]>
        )
      );
  }

这适用于字符串,但不适用于引用。我怎样才能使它也适用于参考文献?

绿色有效,红色无效

绿色:字符串 红色:参考

【问题讨论】:

    标签: angular typescript firebase google-cloud-firestore angular7


    【解决方案1】:

    @Alex Mamo 的回答是对的,你需要一个 DocumentReference。

    注意:您不能自己创建!

    你必须通过查询firebase来获得参考!

    代码:

    return this.auth.currUser
          .pipe(
            take(1),
            switchMap(user => this.afs
                .collection('chats', ref => ref.where('members', 'array-contains', this.afs
                  .collection('users')
                  .doc<User>(user.uid)
                  .ref))
                .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[]>
            )
          );
    

    关键部分是“价值”部分,即:

    this.afs
                  .collection('users')
                  .doc<User>(user.uid)
                  .ref
    

    您查询并然后使用 .ref 获取参考!

    就是这样!这就是您查询 DocumentReference 的方式!

    【讨论】:

      【解决方案2】:

      它适用于字符串,因为您将以下参数作为第三个参数传递给 where() 函数:

      /users/${user.uid}
      

      字符串类型。如果您还想使用引用而不是字符串,请传递一个实际的 DocumentReference 对象。

      【讨论】:

      • 你知道类名吗?什么都找不到
      • 是的,DocumentReference
      • 如果我从 angular/fire/firestore 导入它,它就是一个界面
      • 不明白,不能导入DocumentReference还是不能传递对象?
      • 嗨菲利普!一切都好吗,你解决了吗?
      猜你喜欢
      • 1970-01-01
      • 2020-04-04
      • 2020-11-29
      • 2019-04-20
      • 2021-10-06
      • 1970-01-01
      • 2020-04-04
      • 2020-11-22
      • 1970-01-01
      相关资源
      最近更新 更多