Firebase Cloud功能可将文档中的用户对象保持最新状态

时间:2019-05-07 16:57:03

标签: firebase google-cloud-firestore google-cloud-functions

我正在使用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);
  });
});

1 个答案:

答案 0 :(得分:1)

您的docQueryDocumentSnapshot类型的对象。您可以使用其ref属性来获取该文档的DocumentReference,然后使用该引用的set()方法来修改其内容。