Angular Firestore: Каков правильный синтаксис для запроса коллекции, который использует предложение where? - PullRequest
0 голосов
/ 17 мая 2018

У меня есть рабочий код, который запрашивает Firestore и возвращает Observable типа ImageUploadWId[]. Я хотел бы вернуть Promise вместо этого. Это потому что

  1. мои данные меняются не часто;
  2. Я выполняю удаление на основе входящих данных.

SnapshotChanges() возвращает массив действий. Первое действие содержит неполный массив размера 1. Последнее действие содержит массив размера 4. Последний массив завершен; у него есть все ImageUploadWIds от одного groupId.

Мне нужен только один массив, который имеет ImageUploadWIds только из назначенного groupId. Использование Обещания дает мне ImageUploadWIds из всех groupIds. Я полагаю, что пункт where не работает.

Вот мой рабочий код, который печатает только imageUpload groupIds из одного groupId, но возвращает более одного массива. Последний массив - единственный, который мне нужен. Изменить (добавлены записи журнала):

getImageInfosWIds(bathroomGroupId: string): Observable<ImageUploadWId[]> {
  return this.afs.collection(this.bathroomImagesLocation,
    ref => ref.where('groupId', '==', bathroomGroupId)).snapshotChanges()
    .map(actions => {
      return actions.map(a => {
        const data = a.payload.doc.data();
        const id = a.payload.doc.id;
        const imageUpload = new ImageUploadWId();
        imageUpload.set(id, <ImageUpload>data);
        return imageUpload;
      })
    })
}

onDeleteGroup(groupId: string) {
this.bathroomGroupService.getImageInfosWIds(groupId)
  .subscribe((imageUploads) => {
    console.log("imageUploads.length: " + imageUploads.length);
    for (let imageUpload of imageUploads) {
      console.log("(groupId, filename): (" + imageUpload.groupId + ", " + imageUpload.filename + ")");
    }
  })
}

Вот мой код, пытающийся использовать Обещание. Это печатает imageUploads из обеих моих групп, а не только из заданного bathroomGroupId.

getImageInfosWIds(bathroomGroupId: string): Promise<QuerySnapshot> {
  return this.afs.collection(this.bathroomImagesLocation,
    ref => ref.where("groupId", "==", bathroomGroupId))
    .ref
    .get();
}

onDeleteGroup(groupId: string) {
  this.bathroomGroupService.getImageInfosWIds(groupId)
  .then( (querySnapshot) => {
      querySnapshot.forEach((doc) => {
        console.log("edit-bathrooms: " + doc.data().groupId);
      })
  },
  () => {console.log("Error in edit-bathrooms. promise unfullfilled " +
      "in onDeleteGroup( " + groupId + " )")});
}

Редактировать: это последний код, который работал:

  onDeleteGroup(groupId: string) {
    this.bathroomGroupService.getImageInfosWIdsObservable(groupId)
    .pipe(take(1)).subscribe(
    data => {
      console.log(data[0].groupId);
    });
  }

 getImageInfosWIdsObservable(bathroomGroupId: string) {
   return this.afs.collection(this.bathroomImagesLocation,
   ref => ref.where('groupId', '==', bathroomGroupId)).snapshotChanges() //rxjs 5 -> 6  library
   .pipe(
    map(actions => actions.map(a => {
      const data = a.payload.doc.data();
      const documentId = a.payload.doc.id;
      const imageUpload = new ImageUploadWId();
      imageUpload.set(documentId, <ImageUpload>data);
      return imageUpload;
    }))
  );
}

Только одно последнее слово. Если вы все еще получаете дополнительный массив, вы, возможно, подписались на ту же коллекцию Firestore в другой части вашего кода и не отменили подписку. Это было частью моей проблемы.

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

AngularFire2 переносит ссылку Firebase, поэтому вызов .ref.get() создает новую ссылку и игнорирует указанную вами функцию запроса.

К счастью, RxJS позволяет легко преобразовать Observable в Promise.Вам просто нужно ввести first() или take(1), чтобы принудительно завершить Observable (иначе обещание никогда не разрешится, потому что Firebase предоставляет бесконечный поток в реальном времени).

 return this.afs.collection(...)
  .valueChanges()
  .pipe(first())
  .toPromise()
0 голосов
/ 17 мая 2018

Должно быть,

return this._afs.collection(this.bathroomImagesLocation, x => x
            .where('groupId', '==',bathroomGroupId));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...