Javascript 如何检查MongoDB字段的值是否在字符串中?
因此,我使用mongoose和MongoDB创建了一个聊天机器人,我希望能够查看是否有任何文档与用户所说的内容匹配,而不必精确匹配。我知道如果输入字符串只是元素的一部分,我可以使用$regex操作符,但在我的例子中,元素只是输入字符串的一部分。以下是我目前掌握的情况: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
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:要感谢人们花时间帮助你,你可以接受一个可以接受的答案。请参见问题旁边的灰色复选标记。