在我的云函数中,我有一个包含所有需要获取云消息(通知)的userId的数组
const aNotify = [{id: 'id001', text: 'specialTextFor001'}, {id: 'id002', text: 'specialTextFor002'};
这是设备集合的外观。文档ID是令牌ID,但要找到它们,我需要在userId上查询
是否可以像使用where子句那样通过数据库来完成此操作,还是需要通过获取所有设备来执行此操作,并且在云方法中执行foreach ...?
答案 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
属性并不复杂。