'array-contains' 查询不适用于引用的 Firestore

fil*_*lip 11 firebase typescript angular google-cloud-firestore angular7

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

我用这个查询来做到这一点:

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[]>
        )
      );
  }
Run Code Online (Sandbox Code Playgroud)

这适用于字符串,但不适用于引用。我怎样才能让它在参考文献上工作?

带有集合的图像

绿色有效红色无效

绿色:字符串红色:参考

fil*_*lip 8

@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[]>
        )
      );
Run Code Online (Sandbox Code Playgroud)

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

this.afs
              .collection('users')
              .doc<User>(user.uid)
              .ref
Run Code Online (Sandbox Code Playgroud)

您查询,然后使用 .ref 获取引用!

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


Ale*_*amo 5

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

/users/${user.uid}
Run Code Online (Sandbox Code Playgroud)

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