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



所以我使用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});
});
});

,但这只适用于单个单词字段,如"hello,"而不是像"你好吗"这样的短语;或者"我的名字是。"所以如果有人说"你好吗?"它不会出现在"你好吗?"如果我使用整个字符串,或者如果我把它分成"how"、"are"、"you"、"doing"one_answers"?"。我如何让它看到是否整个字符串从数据库匹配字符串的任何部分从用户?

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

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 doing?"的正则表达式将是/how|are|you|doing/。在构建正则表达式时,我们不需要担心转义字符,因为我们只有alpha字符。

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

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

最新更新