我想在User集合中搜索包含给定用户名的文档,同时用户输入用户名。例如:
数据库:
happyuser
happyuser2
happy_user
userhappy
“hap”中的用户类型,应该找到所有用户名,因为“hap”包含在所有用户名中。当我执行以下操作时,只有在提供完整用户名且找不到查询“hap”的结果时才会找到结果:
User.find(
{
$text: {
$search: "hap",
$diacriticSensitive: true
}
},
{
score: {
$meta: "textScore"
}
}, function(err, results) {
if (err) {
next(err);
return;
}
return res.json(results);
});
当我通过提供正则表达式搜索时,我只得到结果:
User.find({
"username": new RegExp("hap")
}).exec(function(err, results) {
if (err) {
next(err);
return;
}
return res.json(results);
});
但这不是有效的,对吧?我的意思是,使用正则表达式,MongoDB基本上会触及用户集合中的所有文档,或者我错了吗?这种搜索查询的最佳实践解决方案是什么?
答案 0 :(得分:0)
使用正则表达式进行搜索非常有效(至少对于sql),除非您的搜索中包含大量字符(复杂随机搜索),这些字符超出了数据库(正则表达式)的功能,或者除非您有太多的数据库要搜索,你的正则表达式需要永远在合理的时间内找到它们。特别是对于mongoDB,我通常会选择:
>db.collection.find( { key: { $regex: 'P.*'} } ).pretty();
这个命令应该给我关于' key'的所有细节。以字母' P'开头。有些人也使用%"你的表达式 - 这里%。但是,我建议上面的命令更有效率。看一下文档:https://docs.mongodb.com/manual/reference/method/db.collection.find/
答案 1 :(得分:0)
在您的示例的上下文中,您将无法执行纯文本搜索。
$ text运算符匹配完整的词干。所以,如果一个 文档字段包含单词blueberry,搜索术语blue 不会匹配。但是,蓝莓或蓝莓会匹配。
总之,如果你不想搞乱正则表达式。尝试一下:
User.find().$where(function() {
return this.username.indexOf('hap') != -1;
});