当字段中存在反斜杠\换行符时,带正则表达式的Mongo查询失败

时间:2016-02-12 10:01:42

标签: mongodb symfony

您好我在一个名为“Address”的用户集合中有一个字段。用户从我的应用程序中的textarea中保存他们的地址。 mongodb将其转换为新行,如下所示。

  {
   "_id": ObjectId("56a9ba0ffbe0856d4f8b456d"),
   "address": "HOUSE NO. 3157,\r\nSECTOR 50-D",
   "pincode": "",
   },
{
   "_id": ObjectId("56a9ba0ffbe0856d4f8b456d"),
   "address": "HOUSE NO. 3257,\r\nSECTOR 50-C",
   "pincode": "",
   }

所以现在当我在“地址”的基础上运行搜索查询时。如下所示:

guardianAdd = $dm->getRepository('EduStudentBundle:GuardianAddress')->findBy(array(
                'address' => new \MongoRegex('/.*' .$data['address'] . '.*/i'),
                'isDelete' => false
            ));
            echo count($guardianAdd);die;

它没有给出任何结果。我的Searchi关键词是:“HOUSE NO.3157 SECTOR 50-D”。

但是,如果我正在使用像:HOUSE NO。 3157它给出了正确的结果。

请告知如何解决这个问题。提前谢谢

1 个答案:

答案 0 :(得分:0)

首先,尾随.*是多余的。正则表达式/.*aaa.*//aaa/相同且匹配相同的模式。

其次,您可能需要使用多行修饰符/pattern/im

最后,还不是很清楚你想要修复什么。您可以做的最好的想法是在搜索表单中提供正则表达式语法的一些基本解释,以便用户可以正确搜索,例如HOUSE NO.*3157.*SECTOR 50-D以获得最佳效果。

您可以做出一些大胆的假设,并使用类似

的方式构建模式
$pattern = implode('\W+',preg_split('/\W+/', $data['address']))

它会为不同类型的HOUSE\W+NO\W+3157\W+SECTOR\W+50\W+D请求提供正则表达式HOUSE NO.3157 SECTOR 50-D,但它会削减裸输入时可用的所有正则表达式灵活性,并最终导致意外响应。您可以按照这个滑坡并最终使用您自己的查询DSL编译为正则表达式,但我怀疑它可以比纯正则表达式更好或更方便。肯定会更容易出错。

提出正确的问题以获得正确的答案不仅适用于SO,而且适用于您的应用程序。不幸的是,没有一般解决方案来搜索人们想到的东西,但没有问。我相信在您的特定情况下best code is no code