JS:对象值取决于regEx匹配

问题描述 投票:0回答:1

数组中有一些对象如下:

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()

如您所见,我正在按给定的搜索词搜索标题(字符串)或同义词(数组)元素。所以搜索someany会给我第一个文件作为我的结果。

在我的组件中,我按如下方式输出数据:

render () {
  return result.map((link, index) => {
    return <Dropdown.Item
      text={link.title}
      key={index}
    />
  })
}

但是,如果我正在搜索Something(术语),我现在得到输出any的下拉项目。对于用户来说这没有意义。

当然any应该给我输出Anythingsome应该给我输出Something。在这个例子中,您还可以搜索thing,我希望有两个输出元素(一个结果文档):AnythingSomething

我不太确定如何修改代码来获得此结果。我认为修改的最佳位置应该是react组件(输出) - 而不是服务器请求结果。

javascript regex mongodb reactjs
1个回答
0
投票

您可以在服务器端发出两个单独的查询,以清楚地保持文档的哪个部分匹配。这将确保对于使用同义词匹配的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]));

我使用两个查询分别获取字符串,然后采用它们的集合。

在客户端,您可以直接使用这些字符串来显示搜索结果。

© www.soinside.com 2019 - 2024. All rights reserved.