根据Firestore Cloud Functions中的字段值访问文档

时间:2020-05-24 18:09:06

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

我尝试编写一个云功能,该功能应在用户位置更改时触发。


问题

有两种类型的用户。一个是Patient,另一个是RelativePatient的列表为relativesRelative的列表为patients

两个用户都有位置字段。 relativespatients列表分别为nameemail分别具有locationPatientRelative

因此,只要relativespatients更改自己的Relative,我就想更新Patientlocation列表。

例如,X是Patient,Y是Relative。在Y的patients列表中,他拥有Patient X的信息,nameemaillocation。 X更改位置后,还应该在Relative的{​​{1}}列表中更改它。

注意:如果patientsPatient的{​​{1}}列表中。然后Relative在他的relatives列表中有那个RelativePatientpatients都在列表中。


我尝试了什么

Patient集合中触发onUpdate时,我试图获取用户Relative。假设我是email。当我更改位置时,借助users列表,我将搜索每个Relative并更改其patients列表的位置。

我可以访问我的电子邮件和位置。但是我无法获得Patient列表中每个relatives的{​​{1}}。

有人可以帮助我实现上面提到的功能吗?

Patient

如何实现此功能?有帮助吗?

1 个答案:

答案 0 :(得分:0)

我不确定您的数据库结构,因为您还没有附加任何图像,所以我假设了一些事情。我相信RelativePatient都在集合users中,似乎无法区分它们。我假设他们有一个{/ {1}}或relatives子集合,且具有确切的名称/ ID。

我已使用collection groups query来检索其电子邮件为patients的每个relatives子集合上的所有用户。然后,我用userEmail中的位置更新了这些文档。

这将更新currentLocation中所有拥有电子邮件relatives的用户。如果要对子集合userEmail执行相同的操作,只需更改patients中的密钥。

collectionGroup

免责声明,由于不确定您的结构,因此我尚未测试此代码,但是使用const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(); exports.UpdateLocations = functions.firestore.document("users/{userID}").onUpdate((change, context) => { const userEmail = change.after.data().email; const prevLocation = change.before.data().location; const currentLocation = change.after.data().location; if (prevLocation === currentLocation) return; let relativesQuery = db.collectionGroup('relatives').where('email', '==', userEmail); relativesQuery.get().then((querySnapshot) => { querySnapshot.forEach((document) => { document.ref.update({location: currentLocation}); }); }); }); 代替许多嵌套查询仍然是一个不错的起点。