我尝试编写一个云功能,该功能应在用户位置更改时触发。
有两种类型的用户。一个是Patient
,另一个是Relative
。 Patient
的列表为relatives
,Relative
的列表为patients
。
两个用户都有位置字段。 relatives
和patients
列表分别为name
和email
分别具有location
,Patient
和Relative
。
因此,只要relatives
或patients
更改自己的Relative
,我就想更新Patient
和location
列表。
例如,X是Patient
,Y是Relative
。在Y的patients
列表中,他拥有Patient
X的信息,name
,email
,location
。 X更改位置后,还应该在Relative
的{{1}}列表中更改它。
注意:如果patients
在Patient
的{{1}}列表中。然后Relative
在他的relatives
列表中有那个Relative
。 Patient
和patients
都在列表中。
在Patient
集合中触发onUpdate时,我试图获取用户Relative
。假设我是email
。当我更改位置时,借助users
列表,我将搜索每个Relative
并更改其patients
列表的位置。
我可以访问我的电子邮件和位置。但是我无法获得Patient
列表中每个relatives
的{{1}}。
有人可以帮助我实现上面提到的功能吗?
Patient
如何实现此功能?有帮助吗?
答案 0 :(得分:0)
我不确定您的数据库结构,因为您还没有附加任何图像,所以我假设了一些事情。我相信Relative
和Patient
都在集合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});
});
});
});
代替许多嵌套查询仍然是一个不错的起点。