Я использую Firestore для хранения коллекций задач и пользователей.Документ Task может содержать карту пользователей с ролью, примерно такую:
{
"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" - идентификаторы пользователя)
Я хранюскопируйте туда пользовательские объекты, а не только идентификатор, чтобы у меня были все данные, которые мне нужны в 1 запросе, и они готовы к использованию в приложении.
Теперь мне нужно убедиться, чтоесли один из пользовательских объектов в коллекции пользователей верхнего уровня обновляется, чтобы найти все задачи, в которых этот пользователь является участником, а затем обновить этот пользовательский объект на этой карте.
У меня есть большая часть фигурнапример, прослушивание изменений пользователя и поиск задач с этим пользователем в качестве участника.Но теперь мне нужно на самом деле обновить задачу, и именно здесь я нахожусь на контрольно-пропускном пункте.Документ Task не имеет функции 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);
});
});