gpt4 book ai didi

javascript - Firestore简单排行榜功能

转载 作者:行者123 更新时间:2023-12-03 00:47:36 26 4
gpt4 key购买 nike

我正在尝试编写一个云函数,根据赚取的积分对/mobile_user 节点下的用户进行排名,并为其分配排名。我已经成功完成了此操作,但现在我想将这 10 个用户写入另一个名为排行榜的节点。我怎样才能做到这一点?

这是我当前的函数,它已经将它们从 1 排列到 10:

    exports.leaderboardUpdate2 = functions.https.onRequest((req, res) =>{
const updates = [];
const leaderboard = {};

const rankref = admin.firestore().collection('mobile_user');
const leaderboardRef = admin.firestore().collection('leaderboard');

return rankref.orderBy("earned_points").limit(10).get().then(function(top10) {
let i = 0;
console.log(top10)
top10.forEach(function(childSnapshot) {
const r = top10.size - i;
console.log(childSnapshot)
updates.push(childSnapshot.ref.update({rank: r}));
leaderboard[childSnapshot.key] = Object.assign(childSnapshot, {rank: r});
i++;
console.log(leaderboard)
});
updates.push(leaderboardRef.add(leaderboard));
return Promise.all(updates);
}).then(() => {
res.status(200).send("Mobile user ranks updated");
}).catch((err) => {
console.error(err);
res.status(500).send("Error updating ranks.");
});
});

这成功更新了我所有用户所在的/mobile_user 节点,但我想在函数执行后将这 10 个用户“导出”到排行榜节点。

(请注意,排行榜节点始终只能有 10 条记录)

最佳答案

您的云函数存在两个问题:

首先,您不能直接使用 childSnapshot 对象(既不能使用 Object.assign 也不能直接使用)来创建新文档。您必须使用 childSnapshot.data(),请参阅 https://firebase.google.com/docs/reference/js/firebase.firestore.DocumentSnapshot

其次,您使用childSnapshot.key,而它应该是childSnapshot.id,请参阅与上面相同的文档。

最后,请注意,根据您的代码结构,users 文档将作为 map 添加到唯一的 leaderboard 文档下。我不确定这是否正是您想要的,因此您可以针对这一特定点调整您的代码。

所以以下应该有效:

exports.leaderboardUpdate2 = functions.https.onRequest((req, res) => {
const updates = [];
const leaderboard = {};

const rankref = admin.firestore().collection('mobile_user');
const leaderboardRef = admin.firestore().collection('leaderboard');

return rankref
.orderBy('earned_points')
.limit(10)
.get()
.then(function(top10) {
let i = 0;
console.log(top10);
top10.forEach(function(childSnapshot) {
const r = top10.size - i;
updates.push(childSnapshot.ref.update({ rank: r }));
leaderboard[childSnapshot.id] = Object.assign(childSnapshot.data(), {
rank: r
});
i++;
});
updates.push(leaderboardRef.add(leaderboard));
return Promise.all(updates);
})
.then(() => {
res.status(200).send('Mobile user ranks updated');
})
.catch(err => {
console.error(err);
res.status(500).send('Error updating ranks.');
});
});
<小时/>

根据您的评论,这里有一个新版本,它在 leaderboard 集合中为每个 mobile_user 编写一个文档。请注意,我们使用 DocumentReference并与 set() 方法一起使用,如下所示:leaderboardRef.doc(childSnapshot.id).set()

exports.leaderboardUpdate2 = functions.https.onRequest((req, res) => {
const updates = [];
const leaderboard = {};

const rankref = admin.firestore().collection('mobile_user');
const leaderboardRef = admin.firestore().collection('leaderboard');

return rankref
.orderBy('earned_points')
.limit(10)
.get()
.then(function(top10) {
let i = 0;
console.log(top10);
top10.forEach(function(childSnapshot) {
const r = top10.size - i;
updates.push(childSnapshot.ref.update({ rank: r }));

updates.push(
leaderboardRef.doc(childSnapshot.id).set(
Object.assign(childSnapshot.data(), {
rank: r
})
)
);

i++;
});

return Promise.all(updates);
})
.then(() => {
res.status(200).send('Mobile user ranks updated');
})
.catch(err => {
console.error(err);
res.status(500).send('Error updating ranks.');
});
});

关于javascript - Firestore简单排行榜功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53177043/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com