Javascript 如何检查MongoDB字段的值是否在字符串中?

Javascript 如何检查MongoDB字段的值是否在字符串中?,javascript,node.js,regex,mongodb,mongoose,Javascript,Node.js,Regex,Mongodb,Mongoose,因此,我使用mongoose和MongoDB创建了一个聊天机器人,我希望能够查看是否有任何文档与用户所说的内容匹配,而不必精确匹配。我知道如果输入字符串只是元素的一部分,我可以使用$regex操作符,但在我的例子中,元素只是输入字符串的一部分。以下是我目前掌握的情况: app.post('/mood',(req,res) => { const str = req.body.mood.toLowerCase(); var arr = str.split(/([_\W])/); c

因此,我使用mongoose和MongoDB创建了一个聊天机器人,我希望能够查看是否有任何文档与用户所说的内容匹配,而不必精确匹配。我知道如果输入字符串只是元素的一部分,我可以使用$regex操作符,但在我的例子中,元素只是输入字符串的一部分。以下是我目前掌握的情况:

app.post('/mood',(req,res) => {
  const str = req.body.mood.toLowerCase();
  var arr = str.split(/([_\W])/);
  console.log(arr);
  Words.findOne({words: {$in: arr}},(err,data) => {
    if (err) {
      res.json({
        status: 'failure',
        reason: 'Server error.',
        prompt: null
      });
      console.log(err);
      return;
    }
    if (!data || data==null || data==[]) {
      res.json({
        status: 'failure',
        reason: 'We don\'t have a response to that yet. Would you like to make one?',
        prompt: 'make'
      });
      return;
    }
    console.log(data.words);
    var reply = data.responses[Math.floor(Math.random()*data.responses.length)].phrase;
    res.json({ status: 'success', reply});
  });
});

但这只适用于像“你好”这样的单字字段,而不是像“你好吗”或“我的名字是”这样的短语。因此,如果有人说“你好吗?”如果我使用整个字符串,或者如果我将其拆分为“你好”、“是”、“你”、“正在做”和“?”,则不会出现“你好吗”的问题。如何查看数据库中的整个字符串是否与用户字符串的任何部分匹配?

您可以从该字符串构建正则表达式:

  const str = req.body.mood.toLowerCase();
  let regex = new RegExp(str.split(/[_\W+]/).filter(str => {
    return /^[\w]+$/.test(str)
  }).join('|'))
  console.log(regex.toString());
字符串
“你好吗?”
的正则表达式将是
/how | are | you | do/
。在构建正则表达式时,我们不需要担心转义字符,因为我们只有alpha字符

现在,您可以在查询中使用该正则表达式在所有
单词
字段中查找用户提供的单词:

  Words.findOne({words: {$regex: regex}}, ...

我不知道如何在不从数据库加载所有文档的情况下解决这个问题。一旦你这样做了,它就变得微不足道了。@Raphael Morgan:这符合你的需要吗?有问题吗?愿意接受答案吗?@Raphael Morgan:要感谢人们花时间帮助你,你可以接受一个可以接受的答案。请参见问题旁边的灰色复选标记。