首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用mongodb查找结果

使用mongodb查找结果
EN

Stack Overflow用户
提问于 2021-02-16 10:04:51
回答 1查看 27关注 0票数 0

我有一个充满技能的数据库,我正在尝试创建一个info cmd,如果您键入技能名称,您将获得有关它的一些信息。有些技巧是2-3个论点。例如“动物叫声”。我希望能够通过输入!info animal call和像!info ani call这样的缩写来找到我在mongodb中的技能

关于这个的问题是,如果我试图用!info ani call找到它,它不会显示出来。

下面是我的代码:

代码语言:javascript
复制
let skill = args.slice(0).join(" ");

const skillDB = await Skill.find({})

for (let i = 0; i < skillDB.length; i++) {
 if (skillDB[i].skillName.toLowerCase().includes(`${skill.toLowerCase()}`)) {
  const embed = new MessageEmbed()
  .setDescription(`\`${skillDB[i].skillIcon}\` ${skillDB[i].skillName}`)
  .setImage(skillDB[i].skillImg)
  return message.channel.send(embed)
 }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-16 19:41:09

我认为您需要在这里使用某种正则表达式。您可以通过.*将参数连接起来,并将其用作正则表达式,而不是通过空格join参数。

.*可以匹配任何字符,所以当您加入['ani', 'call']时,它将变成一个类似于'ani.*call'的字符串。作为正则表达式模式,/ani.*call/匹配任何同时包含anicall的字符串(按此顺序)。

代码语言:javascript
复制
const args = ['ani', 'call']
const regex = new RegExp(args.join('.*'), 'i')

console.log(`Words matching ${regex}:`)
console.log('animal', regex.test('animal'))
console.log('animal call', regex.test('animal call'))
console.log('anime caller', regex.test('anime caller'))
console.log('anicall', regex.test('anicall'))
console.log('animal cruelty', regex.test('animal cruelty'))
console.log('anemia caribou', regex.test('anemia caribou'))

如果您不想匹配之间没有任何额外字符的单词,可以使用.+连接这些单词。使用+符号要求两个字符串之间至少有一个额外的字符;这样它就不会与anicall匹配

代码语言:javascript
复制
const args = ['ani', 'call']
const regex = new RegExp(args.join('.+'), 'i')

console.log(`Words matching ${regex}:`)
console.log('animal', regex.test('animal'))
console.log('animal call', regex.test('animal call'))
console.log('anime caller', regex.test('anime caller'))
console.log('anicall', regex.test('anicall'))
console.log('animal cruelty', regex.test('animal cruelty'))
console.log('anemia caribou', regex.test('anemia caribou'))

您还可以使用[a-z\s]+仅接受a-z范围内的字符和空格:

代码语言:javascript
复制
const args = ['ani', 'call']
const regex = new RegExp(args.join('[a-z\\s]+'), 'i')

console.log(`Words matching ${regex}:`)
console.log('animal', regex.test('animal'))
console.log('animal call', regex.test('animal call'))
console.log('anime caller', regex.test('anime caller'))
console.log('anicall', regex.test('anicall'))
console.log('animal cruelty', regex.test('animal cruelty'))
console.log('anemia caribou', regex.test('anemia caribou'))

使用当前代码,您可以使用.test()方法而不是.includes()。它搜索正则表达式和指定字符串之间的匹配。

您还可以使用for ... of循环来代替for循环,以使其更具可读性:

代码语言:javascript
复制
const regex = new RegExp(args.join('[a-z\\s]+'), 'i');
const skills = await Skill.find({});
const embed = new MessageEmbed();

for (let skill of skills) {
  if (regex.test(skill.skillName)) {
    embed
      .setDescription(`\`${skill.skillIcon}\` ${skill.skillName}`)
      .setImage(skill.skillImg);

    return message.channel.send(embed);
  }
}

我不明白为什么你要从数据库中获取每一项技能。您还可以将find()findOne()与上面的正则表达式一起使用,以仅获取所需的数据:

代码语言:javascript
复制
const regex = new RegExp(args.join('[a-z\\s]+'), 'i');
// findOne returns a single object or null if not found
const skill = await Skill.findOne({
  skillName: { $regex: regex },
});

if (!skill) {
  return message.channel.send(
    `Oops, I couldn't find any skill in the database for \`${args.join(' ')}\``,
  );
}

const embed = new MessageEmbed()
  .setDescription(`\`${skill.skillIcon}\` ${skill.skillName}`)
  .setImage(skill.skillImg);

return message.channel.send(embed);

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66217802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档