Поиск по значению поля вложенной коллекции в коллекции angularfirestore - PullRequest
0 голосов
/ 16 мая 2019

Попытка поиска в списке на основе поля имени базы данных firebase с помощью angularfirestore. Это даже не показывает какую-либо ошибку в консоли. результат, возвращаемый из кода в сервисе, является пустым массивом. Я отфильтровал и сопоставил данные полезной нагрузки в конструкторе, чтобы получить асинхронность и доступ к вложенным объектам в базе данных

firebase collection

list.html:

    <input type="search" 
          class="form-control"
          [(ngModel)]="searchValue"
          [ngModelOptions]="{standalone: true}"
          (keyup)="searchMasjid()"
          placeholder="Name...">
  <div *ngIf="masjids$ | async; let masjids; else loading">
    <div class="card mb-1" *ngFor="let masjid of masjids">
      <div class="card-body d-flex justify-content-between">
        <div>
          <h5 class="mb-1">{{masjid.masjidInfo.jagah}}-{{masjid.masjidInfo.name}}</h5>
          <small>{{masjid.masjidInfo.address}}</small>
        </div>

list.ts:

export class MasjidListComponent{
  public masjids$: Observable<IMasjid[]>;
  masjids : Array<any>;
  searchValue: string = "";
  filterMasjidName: Array<any>;

  constructor(public firebaseService: FirebaseService, 
              public af: AngularFirestore){
                this.masjids$ = this.af.collection('masjids').snapshotChanges().pipe(
                  map( actions => actions.map(masjid => {
                    let data = masjid.payload.doc.data() as IMasjid;
                    let id = masjid.payload.doc.id;
                    return { id, ...data };
                  }))
                )
              }

  searchMasjid(){
    let value = this.searchValue;
    this.firebaseService.searchMasjids(value).subscribe(
     result => {
        this.filterMasjidName = result;
        this.masjids = this.combineMasjids(result, this.filterMasjidName)
     } 
    )
  }

  combineMasjids(a, b){
    let result = [];
    a.filter(x => {
      return b.filter(x2 =>{
        if(x2.payload.doc.id == x.payload.doc.id){
          result.push(x2);
        }
      });
    });
    return result;
  }
}

service.ts:

searchMasjids(searchValue){
    return this.db.collection('masjids.masjidInfo', 
    ref=>ref.where('name', '>=', searchValue)
    .where('name', '<=', searchValue + '\uf8ff')).snapshotChanges()
  }
}

1 Ответ

0 голосов
/ 16 мая 2019

Насколько я вижу, ваш searchMasjids метод уже потребляет результаты, так как он вызывает snapshotChanges().Это означает, что вызывающий searchMasjids получает обратно QuerySnapshot, в то время как он на самом деле ожидает Query.

. Вместо этого вы должны вернуть коллекцию / запрос:

searchMasjids(searchValue){
    return this.db.collection(
      'masjids.masjidInfo', 
      ref => ref.where('name', '>=', searchValue)
                .where('name', '<=', searchValue + '\uf8ff')
    )
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...