查询Firestore以获取用户ID的所有令牌

时间:2018-10-31 11:59:35

标签: firebase google-cloud-firestore google-cloud-functions

在我的云函数中,我有一个包含所有需要获取云消息(通知)的userId的数组

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

这是设备集合的外观。文档ID是令牌ID,但要找到它们,我需要在userId上查询

devices

是否可以像使用where子句那样通过数据库来完成此操作,还是需要通过获取所有设备来执行此操作,并且在云方法中执行foreach ...?

1 个答案:

答案 0 :(得分:0)

为了找到与device相对应的userId文档,您必须使用一个简单的查询,例如:

const db = admin.firestore();
db.collection('devices').where("userId", "==", element.id).get();

请参阅相应的文档here

由于您需要查询aNotify数组的每个元素,因此需要使用Promise.all(),因为get()返回了Promise。

类似以下的方法将起作用。您必须对其进行调整才能正确返回Cloud Function中的承诺(因为您没有共享Cloud Function代码,因此在这一点上很难提供更多指导)。

    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属性并不复杂。