Firestore, где запрос «массив содержит» не работает со ссылками - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть коллекция 'чатов' с массивом members, который содержит пользователей, участвующих в чате. Проблема в том, что я хочу получить все чаты, в которых участвует текущий пользователь.

Я делаю это с помощью этого запроса:

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[]>
        )
      );
  }

Это хорошо работает для строк, но не работает со ссылками. Как я могу также заставить это работать над ссылками?

Image with Collections

Зеленый работает, красный не работает

Зеленый: Строка Красный: ссылка

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

@ Алекс Мамо ответ правильный, вам нужна 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[]>
        )
      );

Важнейшей частью является часть 'value', которая:

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

Вы запрашиваете и ТО получаете ссылку с помощью .ref!

Вот и все! Вот как вы запрашиваете DocumentReference!

0 голосов
/ 08 ноября 2018

Он работает со строками, потому что вы передаете в качестве третьего аргумента функции where() следующий аргумент:

/users/${user.uid}

, который имеет тип String.Если вы хотите работать со ссылками, а не со строкой, передайте действительный объект DocumentReference .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...