【问题标题】:How can I reduce the size of MongoDB code?如何减少 MongoDB 代码的大小?
【发布时间】:2021-08-29 20:26:07
【问题描述】:

我需要一些帮助来整理这个烂摊子... 如果我可以将所有这些都放入函数中,我正在徘徊,但我真的不知道如何。

if(args[0] == 'add'){
    if(roleType == 'join') add = await roleModel.updateOne({serverID: message.guild.id}, {$addToSet: {joinRoles: role}});
    else if(roleType == 'member') add = await roleModel.updateOne({serverID: message.guild.id}, {$addToSet: {memberRoles: role}})
    else if(roleType == 'mute') add = await roleModel.updateOne({serverID: message.guild.id}, {$addToSet: {muteRoles: role}})
    else return error02 = sendError02(this.usage);
}
else if(args[0] == 'remove'){
    if(roleType == 'join') remove = await roleModel.findOneAndUpdate({serverID: message.guild.id}, {$pull: {joinRoles: role}});
    else if(roleType == 'member') remove = await roleModel.findOneAndUpdate({serverID: message.guild.id}, {$pull: {memberRoles: role}});
    else if(roleType == 'mute') remove = await roleModel.findOneAndUpdate({serverID: message.guild.id}, {$pull: {muteRoles: role}});
    else return error02 = sendError02(this.usage);
}
else if(args[0] == 'reset'){
    if(!roleType) reset = await roleModel.findOneAndUpdate({serverID: message.guild.id}, {$unset: {joinRoles: '', memberRoles: '', muteRoles: ''}});
    else if(roleType == 'join') reset = await roleModel.findOneAndUpdate({serverID: message.guild.id}, {$unset: {joinRoles: ''}});
    else if(roleType == 'member') reset = await roleModel.findOneAndUpdate({serverID: message.guild.id}, {$unset: {memberRoles: ''}});
    else if(roleType == 'mute') reset = await roleModel.findOneAndUpdate({serverID: message.guild.id}, {$unset: {muteRoles: ''}});
}

【问题讨论】:

  • (这个)[stackoverflow.com/questions/38548467/…对你有帮助吗?不是完全起作用,而是查询中的动态字段。
  • 您正在根据许多不同的业务规则执行许多不同的操作。进一步抽象这一点并使代码更密集可能会使您以外的人难以阅读和理解。
  • 我认为这个问题更适合Code Review Stack Exchange 网站

标签: javascript mongodb discord.js


【解决方案1】:

你可以这样做

var action;
var value = role;
if (args[0] == 'add') {
   action= "$addToSet";
} else if (args[0] == 'remove') {
   action= "$pull";    
} else if (args[0] == 'reset') {
   action= "$unset";
}
var operation = {};
for (let r in ["join", "member" ,"mute"]) {
   if(!roleType || r == roleType) operation[r + "Roles"] = value;
}     
var update = {};   
update[action] = operation;
reset = await roleModel.findOneAndUpdate({serverID: message.guild.id}, update);

或者

var operation = {};
for (let r in ["join", "member", "mute"]) {
   if (!roleType || r == roleType) operation[r + "Roles"] = role;
   // The specified value in the $unset expression (i.e. "") does not impact the operation.
}

if (args[0] == 'add') {
   add = await roleModel.updateOne({ serverID: message.guild.id }, { $addToSet: operation });
} else if (args[0] == 'remove') {
   remove = await roleModel.findOneAndUpdate({ serverID: message.guild.id }, { $pull: operation });
} else if (args[0] == 'reset') {
   reset = await roleModel.findOneAndUpdate({ serverID: message.guild.id }, { $unset: operation });
}

【讨论】:

  • 有一个小问题,“$addToSet”在“findOneAndUpdate”中不起作用。但是感谢您的回答!我会用“updateOne”来代替
  • 但是你应该知道它的样子。
  • 与原帖相比,这段代码更难阅读。
  • 当然,但问题不在于如何使其更易于阅读。问题是:如何让它更小?
【解决方案2】:

好的,谢谢 Wernfried Domscheit,我想通了。我决定尝试第二个代码,但我对“r”有一点问题,所以我稍微改变了第一部分。这就是它对我的工作方式:

let operation = {};
let types = ['join', 'member', 'mute']
for (var i = 0; i < types.length; i++){
    if (types[i] == roleType){
    operation[roleType + "Roles"] = role;
}

【讨论】:

    猜你喜欢
    • 2020-10-17
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    相关资源
    最近更新 更多