Вы можете использовать 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();