首页 > 解决方案 > 没有 RegEx 的 Mongoose 部分字段搜索

问题描述

假设我有这个架构:

var mongoose = require("mongoose")
var userSchema = new mongoose.Schema({
   name: {type: String},
   // other fields
}, { collation: { locale: "en_US", strength: 1 } });

我使用排序规则,以便搜索不区分大小写

然后假设我有一个名为“Dave”的文件

{
   name: "Dave",
   // other fields
}

然后,我搜索它,但没有写下整个单词

var userList = {
   .find({name: "da"})
   .exec();
}

如何在不使用正则表达式的情况下完成这项工作?这很慢。我试过做一个索引,然后用 $text 方法搜索,但我不知道如何让它只搜索文档中的特定字段。

标签: searchmongoose

解决方案


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

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

如果您真的很绝望,并且真的不想使用正则表达式,您可以尝试其他方法...尝试创建和存储一个对象,以及文档中的每个可能的子字符串。对象查找是 O(1) 时间,这意味着它会更快,但代价是您在数据库中存储了荒谬的数据量。如果这对你来说没问题,那就试试看。

举个例子吧Dave。您存储的对象可能如下所示:

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

我们可以将此对象存储在一个名为 的字段中substrings。那么当我们进行数据库查找的时候,就这么简单:

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

但是请考虑使用正则表达式......它更简单,更干净,并且专为您想要的而设计。


推荐阅读