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

How do I schedule a cloud function to update every user in the Firebase Realtime database?

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

likesforday
    uid1
       -Amount : 43
    uid2
       -Amount : 567

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

我可以正确更新一条记录,但我不知道如何更新实时数据库中的每个用户。我还希望它是一个原子更新,所以它要么是所有用户,要么是 none.

有很多关于使用 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);

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

谢谢!

我认为没有必要 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 * * * 到 运行。

你的问题中很重要的一点是:

I would also like for it to be an atomic update so it's either all users or none.

为此,您需要使用 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);
    });