我目前正试图在MongoDB数据库上实现一个多字段过滤器,该数据库由多个字段的问题组成。我正在学习《Pro MERN stack》这本书。由Vasan Subramanian,但他的多字段过滤器不包括过滤字符串值。我希望我的字符串过滤器过滤部分匹配,而不仅仅是精确匹配。例如,如果标题是"Hello World"我想查询"你好"。与这个头衔相匹配我已经包含了我的功能JS代码,目前只有当标题输入与后端问题的标题字段完全匹配时才能工作。
我试过用'/'加上标题,然后用'/I'加上标题,当我使用console.log打印过滤器时,它输出{ title: '/Hello/i' }
。但是,如果我只是硬编码这行,并通过输入const issues = await db.collection('issues').find({title: /Hello/i }).toArray();
来删除.find()参数周围的单引号,它将在部分匹配上工作。有什么简单的方法可以解决这个问题吗?
async function list(_, {
status, effortMin, effortMax, title,
}) {
const db = getDb();
const filter = {};
if (status) filter.status = status;
if (title) filter.title = title;
if (effortMin !== undefined || effortMax !== undefined) {
filter.effort = {};
if (effortMin !== undefined) filter.effort.$gte = effortMin;
if (effortMax !== undefined) filter.effort.$lte = effortMax;
}
const issues = await db.collection('issues').find(filter).toArray();
return issues;
}
MongoDB已经提供了一个支持高级搜索功能的解决方案阿特拉斯搜索
该过程要求您为搜索查询创建索引,以便需要高级搜索功能的查询必须引用它们。
创建地图集搜索索引
由于您对文档中的部分匹配字段感兴趣,因此在创建索引
时需要定义自动完成字段{
$search: {
"index": "<index name>", // optional, defaults to "default"
"autocomplete": {
"query": "<search-string>",
"path": "<field-to-search>",
"tokenOrder": "any|sequential",
"fuzzy": <options>
}
}
}
注意fuzzy
对象,因为它允许精确控制搜索的匹配方式。
模糊。maxEdits匹配指定搜索词所需的最大单字符编辑数。取值为1或2。
模糊。prefixLength在结果中每个词的开头必须精确匹配的字符数。
自动完成文档在完成创建索引之后,您将需要使用$search
聚合管道阶段执行如下查询
{
$search: {
"index": "<index-name>",
"autocomplete": {
"query": "<search-string>",
"path": "<field-to-search>"
}
}
}
$search聚合管道阶段文档