如何计算所有在数据库中具有角色的用户的“点数”

Posted

技术标签:

【中文标题】如何计算所有在数据库中具有角色的用户的“点数”【英文标题】:How to count "points" from all users with a role in a database 【发布时间】:2021-01-12 00:30:22 【问题描述】:

好的,我目前正在尝试使用 MongoDB 创建一个“帮派”系统。我已经设置了一个积分系统并想创建“帮派”。我希望一个帮派的一个特征是它具有全球“财富”,它将所有具有该帮派角色的用户添加到一起并将其存储在数据库中。

我如何让所有具有特定角色的用户,然后检查他们的所有点并将它们加在一起。

我的猜测是运行Points.find(serverID: message.guild.id).sort([[`points`, `descending`]

但是,我如何让所有成员都担任一个角色,这样我才能将他们的观点集中在一起。

我的积分模型:

const mongoose = require("mongoose");

const pointsSchema = mongoose.Schema(
    userID: String,
    userName: String,
    serverID: String,
    points: Number
);

module.exports = mongoose.model("Points", pointsSchema);

【问题讨论】:

【参考方案1】:

第一步是让每个具有角色的成员。您可以使用 Role.members 属性轻松完成此操作。然后,您可以使用 Collection.map() 将所有用户按 ID 映射(这样您就可以找到他们的点文档),并使用 Collection.array() 将集合转换为数组。

然后,您可以使用 mongoose $in 运算符查找数组中包含 userID 的每个文档。

最后,您可以使用Array.prototype.reduce() 将所有点相加。

// <role> is a placeholder for the role object
const members = <role>.members.map((m) => m.id).array();

Points.find(
   serverID: message.guild.id, userID:  $in: members  ,
  (err, result) => 
    if (err) throw err;
    if (!result) console.log('There are no users with this role');
    console.log(
      `Point Total: $result.reduce((acc, curr) => acc + curr.points, 0)`
    );
  
);

【讨论】:

它说 const members = args.members.map((m) =&gt; m.id).array(); 地图在 args.members.map 中无法识别 我正试图从这个角色中夺取角色:let role = message.guild.roles.cache.find(r =&gt; r.name === `$args`); 为什么它不起作用?我只需要将 args 放入角色中。它说它是未定义的 args 是一个数组。您需要将其与字符串进行比较。 同样的想法:无法读取未定义公会的“地图”属性。 如果我尝试使用message.guild.roles.cache.get(role).members.map... 运行它,那么它会说无法获取未定义的成员。它是如何未定义的。

以上是关于如何计算所有在数据库中具有角色的用户的“点数”的主要内容,如果未能解决你的问题,请参考以下文章

laravel-如何在 5.1 中使用 zizaco 获得具有所有角色和所有权限的用户?

在Angular中->如何使用基于角色的访问权限检查用户是不是具有权限,并将角色保存在数据库中

具有特定权限的 Postgresql 用户

Discord.js 如何列出具有特定角色的所有成员的显示名称

如何查看oracle数据库里面,用户自己创建的所有用户还有表空间

如何在雪花数据库中列出所有用户的角色?