微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何安排云函数更新 Firebase 实时数据库中的每个用户?

如何解决如何安排云函数更新 Firebase 实时数据库中的每个用户?

我已将云调度程序连接到我的项目并准备好每天运行。我有一个用户的数据,我想每天更新。

likesforday
    uid1
       -Amount : 43
    uid2
       -Amount : 567

我需要将所有金额设置为 0。

我可以正确更新一条记录,但我无法弄清楚如何更新实时数据库中的每个用户。我还希望它是一个原子更新,所以它要么是所有用户,要么没有。

有很多关于使用 onWrite onCreate 等的指南......但我每天都需要 scheduler.onRun 并更新所有数量

我试过这样的事情

exports.resetdailytaps = functions.pubsub
  .schedule("every day 00:00")
  .onRun(async () => {
  console.log("starting");

let updates = {};
let qu = database.ref(`/likesforday/{uid}`).orderByChild("amount");
const snap = await qu.once("value");
snap.forEach((child) => {
  updates[child.key] = 0;
  console.log("childkey: " + child);
});

return database.ref().update(updates);

和其他变体,但无法使其工作。

谢谢!

解决方法

您问题中的一个重点是:

我也希望它是一个原子更新,所以要么全部 用户或没有。

为此,您需要使用 update() 方法,正如您在问题中所做的那样:使用此方法进行的同步更新是原子的。要么所有更新成功,要么所有更新失败。

以下内容可以解决问题:

  exports.resetdailytaps = functions.pubsub
    .schedule('every day 00:00')
    .onRun(async () => {
      console.log('starting');
      const db = firebase.database();
      const updates = {};

      const snapshot = await db.ref('likesforday').once('value');

      snapshot.forEach((childSnapshot) => {
        updates['/likesforday/' + childSnapshot.key + '/Amount'] = 0;
      });
      
      return db.ref().update(updates);
    });
,

我认为没有必要orderByChild,您只是将所有子节点的数量设置为 0。请尝试运行以下代码:

const updates = []

database.ref("likesforday").once("value").then((snapshot) => {
  Object.keys(snapshot).forEach((user) => {
    updates.push(database.ref(`likesforday/${user}`).update({Amount: 0}))
  })
})

await Promise.all(updates)

对于 cron,您也可以尝试 0 0 * * * 在每个午夜运行。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。