如何安排云功能来更新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 * * *

最新更新