【问题标题】:Complex $and and $or query in Mongo using PHP使用 PHP 在 Mongo 中进行复杂的 $and 和 $or 查询
【发布时间】:2015-11-09 23:07:14
【问题描述】:

我正在尝试使用 $and 运算符与 $or 运算符结合使用 php 执行 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
            )
    )
)

【问题讨论】:

  • 唯一复杂的地方是你把它弄得太复杂了,而这本来应该是一个简单的操作。你真的想在这里做什么?在“任何”提供的字段(to、from、receiver)中搜索输入?您查看过$or 的手册页吗?这里的语法确实偏离了轨道,所以我主要想知道为什么你会认为这是正确的。
  • @BlakesSeven 好吧,我想用这个查询来完成的是在集合中搜索与folder=>INBOX 字段匹配的文档,但还要在recipientsfrom 字段中包含电子邮件跨度>

标签: php mongodb mongodb-query


【解决方案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 }
        ]}
    ]
}

但你不需要这样做,因为它已经被这样对待了。

【讨论】:

  • 有趣的是,我没有意识到所有查询参数都是隐式的“和”运算符。就像你一样,我拥有它的方式被包裹在一个“和”运算符中。打算试一试,感谢您的帮助
  • @Chaosjosh 你肯定在{ "number": { "$gte": 2, "$lt": 5 } } 之前看到过类似的东西,这是另一个隐含“和”的例子,用于指定数字之间的范围。语言上下文意味着“简单”而不是困难。大多数条件通常表示“和”,因此它只是默认值。
猜你喜欢
  • 2017-08-11
  • 2012-09-01
  • 1970-01-01
  • 2022-10-04
  • 1970-01-01
  • 1970-01-01
  • 2015-05-05
  • 2021-12-23
  • 1970-01-01
相关资源
最近更新 更多