【问题标题】:Firebase Cloud Function to keep user objects within documents up to dateFirebase 云功能使文档中的用户对象保持最新
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 啊,我很接近哈哈。谢谢!我确实注意到我现在完全用成员映射替换了整个文档,所以我还必须将 set 更改为 update
    猜你喜欢
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 2021-01-11
    • 1970-01-01
    • 2020-10-10
    相关资源
    最近更新 更多