Чтобы найти документ device
, соответствующий userId
, вы должны использовать простой запрос, такой как:
const db = admin.firestore();
db.collection('devices').where("userId", "==", element.id).get();
см. Соответствующий документ здесь .
Поскольку вам нужно сделать запрос для каждого элемента массива aNotify
, вам необходимо использовать Promise.all()
, поскольку get()
возвращает Promise.
Что-то вроде следующего будет работать. Вы должны адаптировать его, чтобы правильно возвращать обещания в вашей облачной функции (поскольку вы не передавали свой код облачной функции, трудно дать дополнительные указания по этому вопросу).
const db = admin.firestore();
var aNotify = [{ id: 'id001', text: 'specialTextFor001' }, { id: 'id002', text: 'specialTextFor002' }];
var promises = []
aNotify.forEach(function (element) {
promises.push(db.collection('devices').where("userId", "==", element.id).get());
});
return Promise.all(promises)
.then(results => {
results.forEach(querySnapshot => {
querySnapshot.forEach(function (doc) {
console.log(doc.id, " => ", doc.data());
//here, either send a notification for each user of populate an array, or....
//e.g. return admin.messaging().sendToDevice(doc.data().token, ....);
});
});
});
Обратите внимание, что массив results
имеет точно такой же порядок, что и массив promises
. Таким образом, при отправке уведомлений несложно получить свойство text
соответствующего объекта массива aNotify
.