【问题标题】: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);

【问题讨论】:

    标签: node.js mongodb discord discord.js


    【解决方案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... 运行它,那么它会说无法获取未定义的成员。它是如何未定义的。
    猜你喜欢
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    • 2021-12-22
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    • 2012-07-21
    相关资源
    最近更新 更多