数组中有一些对象如下:
const result = [
{
"_id": "Dn59y87PGhkJXpaiZ",
"title": "Something",
"synonyms": [ "Anything", "else" ]
},
{ ... }
]
我通过执行以下操作获得此结果:
Content.find({
$or: [
{ title: { $regex: new RegExp(term, 'i') } },
{ synonyms: { $regex: new RegExp(term, 'i') } }
]
}).toArray()
如您所见,我正在按给定的搜索词搜索标题(字符串)或同义词(数组)元素。所以搜索some
或any
会给我第一个文件作为我的结果。
在我的组件中,我按如下方式输出数据:
render () {
return result.map((link, index) => {
return <Dropdown.Item
text={link.title}
key={index}
/>
})
}
但是,如果我正在搜索Something
(术语),我现在得到输出any
的下拉项目。对于用户来说这没有意义。
当然any
应该给我输出Anything
和some
应该给我输出Something
。在这个例子中,您还可以搜索thing
,我希望有两个输出元素(一个结果文档):Anything
和Something
。
我不太确定如何修改代码来获得此结果。我认为修改的最佳位置应该是react组件(输出) - 而不是服务器请求结果。
您可以在服务器端发出两个单独的查询,以清楚地保持文档的哪个部分匹配。这将确保对于使用同义词匹配的doc不用于返回标题。
const matchingTitles = Content.find(
{ title: { $regex: new RegExp(term, 'i') } }
}, {title: 1} ).toArray().map(x => x.title);
const matchingSynonyms = Content.find(
{ synonyms: { $regex: new RegExp(term, 'i') } }
}, {synonyms: 1} ).toArray().map(x => x.synonyms).reduce((x, y) => x.concat(y), []);
return Array.from(new Set([...matchingTitles, ...matchingSynonyms]));
我使用两个查询分别获取字符串,然后采用它们的集合。
在客户端,您可以直接使用这些字符串来显示搜索结果。