Как я могу получить UID каждого документа, полученного из FireStore DB, когда я подписываюсь на свой метод обслуживания (выполняя запрос)? - PullRequest
0 голосов
/ 14 июля 2020

Я работаю над проектом Angular, извлекающим данные из базы данных Firebase FireStore . Он работает нормально, но теперь я обнаружил проблему при попытке получить UID документов. Я постараюсь подробно объяснить свою ситуацию.

В моей БД FireStore есть что-то вроде этого:

введите описание изображения здесь

Итак, как вы можете видеть, на данный момент у меня есть только одна коллекция с именем calendar , содержащая некоторые документы, в которых каждый документ представляет событие в календаре (но эта деталь теперь не так важно).

В моем Angular приложении у меня есть класс обслуживания, содержащий этот метод, который просто выполняет запрос для извлечения всех документов из моей календарной коллекции:

/**
* Return the list of all the work shift related to all the person in the calendar:
*/
getEvents(): Observable<any[]> {
    this.items = this.db.collection('calendar').valueChanges();

    return this.items;
}

Итак, этот метод возвращает массив Observable для любых объектов.

Подписка на этот Observable в свой компонент Я получаю список документов, хранящихся в коллекция calendar в FireStore.

Я сделал таким образом (это фрагмент кода в моем файле машинописного текста компонента, вызывающем предыдущий метод обслуживания):

this.eventService.getEvents().subscribe(events => { this.events = events.map((event) => {

  //console.log("START: ", event.start);
  var date = event.start.toDate()
  var hour = date.getHours();

  var startDateAsString = this.fromDateToString(date);

  event.start = startDateAsString;

  if(hour === 7) {
    event['backgroundColor'] = 'red';
  }
  else if(hour === 15) {
    event['backgroundColor'] = 'green';
  }
  else if(hour === 23) {
    event['backgroundColor'] = 'black';
  }

  console.log("EVENT: ", event);

  return event;
})});

Итак, как вы можете видеть, я подписываюсь на предыдущий сервисный метод, выполняющий запрос, и я "повторяю" набор результатов запроса, используя оператор map () , строящий m y this.events массив. Он работает нормально.

Моя проблема: в этом контексте, как я могу получить UID каждого документа, полученного Firebase, чтобы добавить эту информацию к возвращаемой переменной event ?

1 Ответ

2 голосов
/ 14 июля 2020

valueChanges() не включает id для получаемых документов. Вам нужно использовать snapshotChanges(), а затем передать данные по конвейеру для создания объекта.

Я делаю что-то подобное в своем приложении

this.db.collection('collectionName').snapshotChanges().pipe(
    map(snapshots => {
       return snapshots.map(s => {
        // if you log s here, you can look through the object
        // payload.doc.data() should be the same as what valueChanges returns
        // payload.doc.id will be the id
        // merge them into a new object
        return {...s.payload.doc.data(), id: s.payload.doc.id)}
     })
    }
);
...