不使用RegEx的猫鼬部分字段搜索

时间:2019-02-22 14:49:12

标签: search mongoose

比方说我有这个模式:

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方法进行搜索,但我不知道如何创建索引,以便它仅搜索文档中的特定字段。

1 个答案:

答案 0 :(得分:0)

我相信使用REGEX是您最好的解决方案。您想做的实际上就是正则表达式的目的。是的,它很慢,但是您尝试实现的任何其他选项都可能会更慢。

创建文本索引并使用$text仅用于匹配完整单词,因此您不能使用此方法。

如果您真的很绝望,并且真的不想使用正则表达式,则可以尝试其他操作...尝试创建和存储对象,并在文档中包含每个可能的子字符串。对象查找的时间为O(1),这意味着它会更快,但是要权衡的是要在数据库中存储大量的数据。如果您满意,请尝试一下。

例如,使用Dave。您存储的对象可能看起来像这样:

{
  "d": 1,
  "da": 1,
  "dav": 1,
  "dave"" 1
}

我们可以将此对象存储在名为substrings的字段中。然后,当我们执行数据库查找时,它很简单:

User.find({ 'substrings.da': { $exists: true }})

但是请考虑使用正则表达式...它更简单,更简洁,并且完全按照您的需求设计。