【发布时间】:2019-05-07 16:57:03
【问题描述】:
我正在使用 Firestore 来存储任务和用户的集合。任务文档可以包含具有角色的用户地图,如下所示:
{
"title": "Task",
"content": "Do this task",
"members": {
"ABC": {
"role": "roleA",
"user": {
"diplayName": "Kevin",
"email": "xxx",
"photoURL": "xxx"
}
},
"XYZ": {
"role": "roleB",
"user": {
"diplayName": "Steve",
"email": "xxx",
"photoURL": "xxx"
}
}
}
}
(其中“ABC”和“XYZ”是用户ID)
我在那里存储用户对象的副本,而不仅仅是 ID,这样我就拥有了 1 个查询中所需的所有数据,可以在应用程序中使用。
现在,我需要做的是确保如果顶级用户集合中的用户对象之一已更新,则查找以该用户为成员的所有任务,然后在该地图中更新该用户对象.
我已经弄清楚了大部分的部分,比如监听用户的变化,并找到该用户作为成员的任务。但现在我需要实际更新任务,这就是我遇到的障碍。任务文档没有 set 函数,我在文档中找不到如何像这样实际更新它。
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
const db = admin.firestore();
exports.updateUser = functions.firestore.document('users/{userId}').onUpdate((change, context) => {
const user = change.after.data();
const userId = context.params.userId;
const query = db.collection('tasks').where(`members.${userId}.role`, '>', '');
return query.get().then((snapshot) => {
snapshot.forEach((doc) => {
let members = doc.data().members
members[userId].user = user
doc.set({members: members}).then(writeResult => {
console.log(`Document written at: ${writeResult.writeTime.toDate()}`);
});
});
})
.catch((err) => {
console.log('Error getting documents', err);
});
});
【问题讨论】:
标签: firebase google-cloud-firestore google-cloud-functions