MongoDB - 使用正则表达式通配符进行搜索,以正确筛选结果

时间:2013-07-20 00:31:28

标签: mongodb

我有一个Mongo搜索设置,根据众多标准查看我的条目。

目前最简单的方法(我知道由于使用通配符而不是性能友好,但由于不区分大小写且用户没有整篇文字,我无法找到更好的方法)是使用正则表达式通配符在搜索中。搜索最终看起来像这样:

{ gender: /Womens/i, designer: /Voodoo Girl/i } // Should return ~200 results
{ gender: /Mens/i, designer: /Voodoo Girl/i } // Should return 0 results

在上面的示例中,两个搜索都返回〜200个结果(“Voodoo Girl”是女性标签,所有相应的条目都有gender: "Womens"字段。)。奇怪的是,当我进行其他搜索时,例如:

{ designer: /Voodoo Girl/i, store: /Store XYZ/i } //应返回0结果

我得到正确的结果数(0)。这是订单吗?如何确保我的搜索返回与我的通配符查询所有匹配的结果?

供参考,我们通过简单的nodeJS查询在db.products.find({criteria})中进行查询。

1 个答案:

答案 0 :(得分:2)

要快速回答这一点,ElasticSearch之类的内容是在您的应用中获得更强大,更高效的搜索功能的绝佳方式。

现在,您的搜索返回结果的原因是“男性”是“女性”的子串!您可能需要/^Mens/i/^Womens/i(如果Mens启动性别字段),或者/\bMens\b/,如果它可以出现在字段的中间。第一个表单只匹配字符串开头的给定字段,而第二个表单查找由单词边界包围的给定单词(即不作为另一个单词的子字符串)。

如果你可以使用/^Mens/表单(注意缺少/i),那么建议使用锚定区分大小写的正则表达式查询can use indexes,而其他正则表达式不能。{ / p>

  

$ regex只能在正则表达式具有字符串开头(即^)的锚点时有效地使用索引,并且是区分大小写的匹配。