Запросите FireStore, чтобы получить все токены от пользователей. - PullRequest
0 голосов
/ 31 октября 2018

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

const aNotify = [{id: 'id001', text: 'specialTextFor001'}, {id: 'id002', text: 'specialTextFor002'};

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

devices

Можно ли сделать это через БД, как с предложением where, или мне нужно сделать это, заставив все устройства и в облачном методе выполнить foreach ...?

1 Ответ

0 голосов
/ 31 октября 2018

Чтобы найти документ 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.

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