Как я могу получить все объекты document из коллекции в cloud-firestore?

#javascript #firebase #google-cloud-firestore #rxjs #angularfire2

#javascript #firebase #google-cloud-firestore #rxjs #angularfire2

Вопрос:

Когда я пытаюсь получить документ из вложенной коллекции, я получаю объект, содержащий только значения из документа.

Ответ выглядит так:

 {
 id: mealDocumentId,
 name: 'Burger',
 imageUrl: 'imgUrl1',
 price: 3, quantity: 1
} 
  

Есть ли способ получить объект из всего документа?

Я ожидал объекты из документов, подобных этому:

  {
  mealDocumentId1: {
    name: 'Burger1',
    imageUrl: 'imgUrl1',
    price: 1,
    quantity: 1,
  },
  mealDocumentId2: {
    name: 'Burger2',
    imageUrl: 'imgUrl2',
    price: 2,
    quantity: 2,
  },
 }
  

Код, который я запускаю:

  constructor(private db: AngularFirestore) { }

  getAllMealDocuments() {
    // this is the path to the subselection meals
    const docRef = this.db.collection('tables').doc('documentId').collection('meals');
    
    // try to get a document object and pass it.
    return  docRef.snapshotChanges().pipe(map(document => {
      document.map(doc => {
        return new Meal({
          id: doc.payload.doc.id,
          ...(doc.payload.doc.data() as {})
        });
      });
    }));
  }
  

Есть ли другой способ получить все документы? Предпочтительно, как ожидаемый формат?
Спасибо!

Ответ №1:

Похоже, вы ищете documentChanges поток, который (в отличие valueChanges от) включает идентификатор каждого документа в свой вывод.

Я бы рекомендовал ознакомиться с документацией AngularFire по потоковым данным коллекции для типов потоков и различий между ними.

Комментарии:

1. Привет, Фрэнк! Спасибо за быстрый ответ. Вы правы, я хочу получить идентификатор, и поэтому я вызвал snapshotChanges. Моя проблема в том, что когда я перебираю полученные данные, я возвращаю все значения из документа, а не из объектов документа. Знаете ли вы, является ли это единственным способом получения документов?

2. Что вы подразумеваете под «объектами документа» и «ожидаемым форматом»? В коде, которым вы поделились в своем обновлении, вы можете сохранить doc или извлечь doc.id и doc.data() . Я не уверен, какой другой вариант вы ищете.

3. Я хочу вернуть документы другим способом. Итак, теперь я получаю объекты типа {…}, но я хочу получать пары ключ-значение, такие как {documentId: {…value …}} . documentId должен быть ключом, а «все остальное» — значением… Надеюсь, это понятно. 🙂

4. Это не вариант из AngularFire API, поэтому вам придется преобразовать documentChanges поток в нужный формат.