Облачная функция Firebase для своевременного обновления пользовательских объектов в документах - PullRequest
0 голосов
/ 07 мая 2019

Я использую 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);
  });
});

1 Ответ

1 голос
/ 07 мая 2019

Ваш doc является объектом типа QueryDocumentSnapshot . Вы можете использовать его свойство ref , чтобы получить DocumentReference для этого документа, а затем использовать метод set() этой ссылки для изменения его содержимого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...