我正在使用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);
});
});
答案 0 :(得分:1)
您的doc
是QueryDocumentSnapshot类型的对象。您可以使用其ref属性来获取该文档的DocumentReference,然后使用该引用的set()
方法来修改其内容。