Firestore - запрос глубокого сбора за один цикл - PullRequest
0 голосов
/ 19 июня 2020

У меня есть такой объект firestore:

{
  countries:[
    country1: {
      cities: [
        city1: {date_added: timestamp},
        ...
      ]
    }
    ...
  ]
}

Итак, я хотел бы в одном запросе , чтобы получить список городов. Я знаю, что могу go понравиться (я в функциях firestore)

const cities = [];

admin.firestore().collection('countries/')
    .get()
    .then(countriesSnapshot => {
      countriesSnapshot .forEach( countryDoc => {
        admin.firestore().collection('countries/' + countryDoc.id + '/cities/')
          .get()
          .then(citySnapshot => {
            citySnapshot.forEach( cityDoc => {
              cities.push(cityDoc.id);
            });
          }).catch();
      });
    }).catch();

Но это делает двойной foreach, и я хочу обрабатывать только после того, как все решено. Я мог бы с promise.all, но мне интересно, есть ли более простой способ go - что-то вроде

admin.firestore().collection('countries/{countryId}/cities').get().then(citySnapshot ...

Ответы [ 2 ]

1 голос
/ 21 июня 2020

Итак, похоже, что нет возможности сделать это в определенной c подколлекции = Ответ Фрэнка дал решение, которое могло бы работать в некоторых случаях, но не будет работать в моем, поскольку мое имя не является уникальным в моем DB.

Итак, мое решение состоит в том, чтобы сделать это в любом случае в двух циклах, но не один в другой - используя Promises. Вот так:

admin.firestore().collection('countries/')
  .get()
  .then(countriesSnapshot => {
    const citiesPromises = [];
    countriesSnapshot.forEach( countryDoc => {
      citiesPromises.push(admin.firestore().collection('countries/' + countryDoc.id + '/cities/').get());
    });
    Promise.all(citiesPromises).then(resources => {
      for (const resource of resources) {
        resource.forEach( doc => {
          // do stuff with doc.id or doc.data()
        });
      }
    }).catch();
  }).catch();
1 голос
/ 19 июня 2020

Если вы хотите выполнить запрос по всем коллекциям cities, вы можете использовать запрос группы :

let cities = db.collectionGroup('cities');
cities.get().then(function(querySnapshot) {
  querySnapshot.forEach(function(doc) {
    console.log(doc.id, ' => ', doc.data());
  });
});

Это вернет все города во всех странах.

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