比方说我有这个模式:
var mongoose = require("mongoose")
var userSchema = new mongoose.Schema({
name: {type: String},
// other fields
}, { collation: { locale: "en_US", strength: 1 } });
我使用排序规则,以便搜索不区分大小写
然后假设我有一个名为“戴夫”的文档
{
name: "Dave",
// other fields
}
然后,我搜索它,但没有写出整个单词
var userList = {
.find({name: "da"})
.exec();
}
如何在不使用正则表达式的情况下完成这项工作?哪个都比较慢。我试过做一个索引,然后使用$ text方法进行搜索,但我不知道如何创建索引,以便它仅搜索文档中的特定字段。
答案 0 :(得分:0)
我相信使用REGEX是您最好的解决方案。您想做的实际上就是正则表达式的目的。是的,它很慢,但是您尝试实现的任何其他选项都可能会更慢。
创建文本索引并使用$text
仅用于匹配完整单词,因此您不能使用此方法。
如果您真的很绝望,并且真的不想使用正则表达式,则可以尝试其他操作...尝试创建和存储对象,并在文档中包含每个可能的子字符串。对象查找的时间为O(1),这意味着它会更快,但是要权衡的是要在数据库中存储大量的数据。如果您满意,请尝试一下。
例如,使用Dave
。您存储的对象可能看起来像这样:
{
"d": 1,
"da": 1,
"dav": 1,
"dave"" 1
}
我们可以将此对象存储在名为substrings
的字段中。然后,当我们执行数据库查找时,它很简单:
User.find({ 'substrings.da': { $exists: true }})
但是请考虑使用正则表达式...它更简单,更简洁,并且完全按照您的需求设计。