Firestore, где функция не работает должным образом в приложении Ioni c / Angular - PullRequest
1 голос
/ 03 мая 2020

Вот коллекция User в моей базе данных пожарного магазина:

enter image description here

Я пытаюсь использовать приведенный ниже метод только для возврата Users где isMechanic === false:

private _mechanics = new BehaviorSubject<User[]>([]);

  get mechanics() {
    return this._mechanics.asObservable();
  }

 return of(
      firebase.firestore().collection("users").where("isMechanic", "==", "false")
        .get()
        .then((docs) => {
          const data = []
          docs.forEach((doc) => {
            data.push(doc);
          });
          this._mechanics.next(data)
          console.log('Mechanics in UsersService:', this._mechanics);
          console.log('Mechanics in UsersService:', this.mechanics);
        }).catch((err) => {
          console.log(err);
        })
    );

В данный момент нет записей. Когда вызывается этот метод, в консоль записывается пустой массив. Поэтому никакие записи не возвращаются, хотя (согласно скриншоту) isMechani c для этой записи false.

Может кто-нибудь сказать, какие изменения необходимы для работы этой функции, как ожидается?

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Мне удалось выяснить это только сейчас.

Если я заменим "false" на false, тогда коллекция users отфильтруется, как и ожидалось.

Замена

firebase.firestore().collection("users").where("isMechanic", "==", "false")

с

firebase.firestore().collection("users").where("isMechanic", "==", false)

возвращает только users, где isMechanic == false

0 голосов
/ 03 мая 2020

LoadedMechanics - это пустой массив:

Тогда обязательно user.isMechanic будет undefined или null

Посмотрите на следующий пример

let data = [
{
},
{
   IsMechanic: undefined
},
{
   IsMechanic: null
},
{
   IsMechanic: false
}
]

console.log(data)

data = data.filter(pr => pr.IsMechanic === false)

console.log(data)

filter функция игнорирует большинство случаев.

Теперь вопрос в том, что такое users объект? Похоже, массив документов для меня. Обычно, чтобы получить все свойства из документа, вы должны использовать ... функцию data ().

users.map(user => ({
  id: user.id,
  ...user.data()
}))

Вы делали это в вашей this.usersService.users наблюдаемой?

- Edit

Вы можете изменить следующий код

const data = []
docs.forEach((doc) => {
data.push(doc);
this._mechanics.next(data);
});

на

const data = docs.docs.map(doc => ({id: doc.id, ...doc.data()}));
this._mechanics.next(data);

Также в соответствии с документами

Вы должны фильтровать логические свойства, используя буквальные значения, а не двойные кавычки

.where("isMechanic", "==", "false")

.where("isMechanic", "==", false)

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