问题描述
我已将云调度程序连接到我的项目并准备好每天运行。我有一个用户的数据,我想每天更新。
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 * * *
在每个午夜运行。