Запрос нескольких коллекций Firestore для одного поля - PullRequest
0 голосов
/ 19 февраля 2020

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

            firebase
            .firestore()
            .collection('creators') // ### Would need to loop for 4 others like this #####
            .where('description', '==', '')
            .get()
            .then((snapshot) => {
                if (snapshot.empty) {
                    console.log('No matching documents.')
                    return
                }

                snapshot.forEach((doc) => {
                    console.log(doc.id, '=>', doc.data())
                })
            })
            .catch((err) => {
                console.log('Error getting documents', err)
            })

1 Ответ

3 голосов
/ 19 февраля 2020

Вы можете использовать Promise.all() для выполнения всех запросов параллельно следующим образом:

   const db = firebase.firestore();

   const q1 = db.collection('creators').where('description', '==', '...').get();
   const q2 = db.collection('xyz').where('description', '==', '...').get();

   return Promise.all([q1, q2])
   .then(snapshotsArray => {

       snapshotsArray.forEach(snap => {
            snap.forEach(doc => {
                console.log(doc.id, '=>', doc.data())
            })
       })

   })

Вы можете упростить это следующим образом :

   const collectionNames = ['creators', 'klmn', 'opqr', 'stuv']
   const promises = collectionNames.map(x => db.collection(x).where('description', '==', '...').get());

   Promise.all(promises)
   .then(snapshotsArray => {

       snapshotsArray.forEach(snap => {
            snap.forEach(doc => {
                 console.log(doc.id, '=>', doc.data())
            })
       })

   })

Как описано в do c, указанном выше:

Метод Promise.all() возвращает одно Обещание, которое выполняется, когда все обещания переданы как Итерируемое выполнено

...

Возвращенное обещание выполняется с массивом, содержащим все значения итерируемого значения, переданного в качестве аргумента (также значения без обещаний).


ОДНАКО,

есть важный момент, на который следует обратить внимание, основываясь на этом предложении в вашем вопросе: «найти документы в нескольких собраниях, где есть документы без поля описания * 1028» * ".

Вы не можете создать запрос в Firestore, который возвратит документ без заданного поля . Причина (механизм индексации) хорошо объяснена в этом официальном видео .

С другой стороны, вы можете запросить документ с пустым полем:

db.collection('creators').where('description', '==', '').get();

или с полем со значением null:

db.collection('creators').where('description', '==', null).get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...