使用PHP在Mongo中复杂的$和$或查询

时间:2015-11-09 23:07:14

标签: php mongodb mongodb-query

我正在尝试使用$和运算符结合$或运算符执行mongo find,但是我似乎无法找出执行它的方法。此查询尝试完成的操作是搜索folder=>INBOX并匹配recipientfrom的电子邮件查询。以下是我尝试这样做的方法:

查询:

$query['$and'][]['$or'][]['to']['$regex'] = new MongoRegex("/".$_GET['term'].".*/i");
$query['$and'][]['$or'][]['from']['$regex'] = new MongoRegex("/".$_GET['term'].".*/i");
$query['$and'][]['$or'][]['recipient']['$regex'] = new MongoRegex("/".$_GET['term'].".*/i");
$query['$and'][]['folder'] = $_GET['folder'];

打印前:

Array
(
[$and] => Array
    (
        [0] => Array
            (
                [$or] => Array
                    (
                        [0] => Array
                            (
                                [to] => Array
                                    (
                                        [$regex] => MongoRegex Object
                                            (
                                                [regex] => example@example.com.*
                                                [flags] => i
                                            )
                                    )
                            )
                    )
            )
        [1] => Array
            (
                [$or] => Array
                    (
                        [0] => Array
                            (
                                [from] => Array
                                    (
                                        [$regex] => MongoRegex Object
                                            (
                                                [regex] => example@example.com.*
                                                [flags] => i
                                            )
                                    )
                            )
                    )
            )
        [2] => Array
            (
                [$or] => Array
                    (
                        [0] => Array
                            (
                                [recipient] => Array
                                    (
                                        [$regex] => MongoRegex Object
                                            (
                                                [regex] => example@example.com.*
                                                [flags] => i
                                            )
                                    )
                            )
                    )
            )
        [3] => Array
            (
                [folder] => INBOX
            )
    )
)

1 个答案:

答案 0 :(得分:1)

没有涉及$and条件。您要做的就是使用提供的正则表达式搜索每个字段,以查看它是否与其中一个中的内容匹配。这是$or操作所做的,并且基于作为查询的参数数组中提供的“任一”条件进行匹配:

{
    "folder": "INBOX",
    "$or": [
        { "to": /example@example.com.*/i },
        { "from": /example@example.com.*/i },
        { "recipient": /example@example.com.*/i }
    ]
}

用于PHP的注释:

$query = array(
    'folder' => 'INBOX',
    '$or' => array(
        array( 'to' => new MongoRegex("/".$_GET['term'].".*/i") ),
        array( 'from' => new MongoRegex("/".$_GET['term'].".*/i") ),
        array( 'recipient' => new MongoRegex("/".$_GET['term'].".*/i") )
    )
)

这就是它的全部内容。

所有 MongoDB查询参数无论如何都隐式地是“和”操作,因此很少需要使用显式运算符。如果使用它,那么它将是两个条件的“包装”语句:

{
    "$and": [ 
        { "folder": "INBOX" },
        { "$or": [
            { "to": /example@example.com.*/i },
            { "from": /example@example.com.*/i },
            { "recipient": /example@example.com.*/i }
        ]}
    ]
}

但是你不需要这样做,因为无论如何它已经被这样对待了。