我正在尝试使用$和运算符结合$或运算符执行mongo find,但是我似乎无法找出执行它的方法。此查询尝试完成的操作是搜索folder=>INBOX
并匹配recipient
或from
的电子邮件查询。以下是我尝试这样做的方法:
查询:
$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
)
)
)
答案 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 }
]}
]
}
但是你不需要这样做,因为无论如何它已经被这样对待了。