【问题标题】:PHP's MongoDB\BSON\Regex - checking multiple fieldsPHP 的 MongoDB\BSON\Regex - 检查多个字段
【发布时间】:2017-05-16 15:12:43
【问题描述】:

背景信息

我有一个带有 Mongo 3.4.3 后端的 PHP 7 Web 应用程序。只是四处寻找如何最好地提供一个“快速搜索”字段,允许用户输入任何字符串,并让系统尝试搜索文档类型中的所有字段并返回匹配项。

文档如下所示:

{ "_id" : ObjectId("582f62aa6b6347a422abcc97"), "department" : "Accounting", "description" : "some test description", "phnum" : "+19991231234", "fax" : "", "site" : "MMN" }

我只是在玩文本搜索和正则表达式。

问题

对于文本搜索,您似乎不能包含通配符。它只会检查确切的表达式。 所以我一直在玩正则表达式,它们更灵活。但是,我需要一种方法来检查所有字段中的字符串……而不仅仅是一个。

代码

这里有一些当前可以工作的测试代码,但它只搜索一个字段:

<?php
        $mongo = new \MongoDB\Driver\Manager('mongodb://127.0.0.1:27017');        
        $filter = [
            //'description' => new MongoDB\BSON\Regex( '^account', 'i' )  // description STARTS with.  THis code works.
            //'phnum' => new MongoDB\BSON\Regex( '^\+1567', 'i' )      // ph number STARTS with .  This code works.
            //'phnum' => new MongoDB\BSON\Regex( '0186', 'i' )      // phnumber contains.  This code works as expected.
            'description' => new MongoDB\BSON\Regex( '^account', 'i' )
        ];
        $options = [
            'sort' => array( 'OrderBy' => -1 )
        ];
        $mongoQuery = new MongoDB\Driver\Query( $filter, $options );    
        $cursor = $mongo->executeQuery('widgets.contact', $mongoQuery);
        //var_dump($rows);
        echo "<table><th>Department</th><th>Description</th><th>Phone</th><th>Fax</th><th>Site</th>";
        foreach ($cursor as $document) {
            //var_dump($document);
            echo "<tr>";
            echo "<td>$document->department</td>";
            echo "<td>$document->description</td>";
            echo "<td>$document->phnum</td>";
            echo "<td>$document->fax</td>";
            echo "<td>$document->site</td>";
            echo "</tr>";
        }
        echo "</table>"
?>

问题

如何更改此代码以搜索所有字段 - 部门、描述等。我可以使用各种通配符吗?我一直在搜索stackoverflow,但到目前为止我还没有找到答案。

任何提示将不胜感激。

【问题讨论】:

    标签: php mongodb mongodb-query


    【解决方案1】:

    $filter 可以包含多个条件。默认情况下,它使用and 运算符,但您也可以显式使用or。如果单个字段有多个条件,则需要显式使用and

        $filter = [
            'description' => new MongoDB\BSON\Regex( '^account', 'i' ),
            '$and' => [
                ['phnum' => new MongoDB\BSON\Regex( '^\+1567', 'i' )],
                ['phnum' => new MongoDB\BSON\Regex( '0186', 'i' )],
            ]  
        ];
    

    返回描述以“帐户”开头、电话以“+1567”开头并包含“0186”的文档。

        $filter = [
            '$or' => [
                'description' => new MongoDB\BSON\Regex( '^account', 'i' ),  
                '$and' => [
                    ['phnum' => new MongoDB\BSON\Regex( '^\+1567', 'i' )],
                    ['phnum' => new MongoDB\BSON\Regex( '0186', 'i' )],
                ]  
            ]
        ];
    

    返回描述以“帐户”开头或电话以“+1567”开头并包含“0186”的文档。

        $filter = [
            'description' => new MongoDB\BSON\Regex( '^account', 'i' ),
            '$or' => [
                ['phnum' => new MongoDB\BSON\Regex( '^\+1567', 'i' )],
                ['phnum' => new MongoDB\BSON\Regex( '0186', 'i' )],
            ]  
        ];
    

    返回描述以“帐户”开头且电话以“+1567”开头或包含“0186”的文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-24
      • 2017-09-28
      • 2016-04-19
      相关资源
      最近更新 更多