如何安排云功能来更新 Firebase 实时数据库中的每个用户?
How do I schedule a cloud function to update every user in the Firebase Realtime database?
-
firebase
-
firebase-realtime-database
-
google-cloud-functions
-
google-cloud-firestore
-
google-cloud-scheduler
我已将云调度程序连接到我的项目并准备好每天 运行。我有附加到用户的数据,我想每天更新。
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);
});
firebase
firebase-realtime-database
google-cloud-functions
google-cloud-firestore
google-cloud-scheduler
我已将云调度程序连接到我的项目并准备好每天 运行。我有附加到用户的数据,我想每天更新。
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);
});