在 MongoDB 中通过 PHP 使用 NotIn 和正则表达式
Posted
技术标签:
【中文标题】在 MongoDB 中通过 PHP 使用 NotIn 和正则表达式【英文标题】:Using NotIn & Regex in MongoDB with PHP 【发布时间】:2014-10-02 08:02:49 【问题描述】:我有一个包含一些用户电子邮件地址的表格,例如:
johndoe@somemail.com
test@test_mail.com
test2@test_mail.com
admin@company_mail.com
janedoe@someothermail.com
sales@company_mail.com
mruser@validmail.com
我想获取电子邮件不以@test_mail.com 或@company_mail.com 结尾的用户列表。 我通过以下 mongo 查询成功:
db.users.find(
userEmail:
$nin: [/@test_mail.com$/,/@company_mail.com$/]
)
我尝试使用以下代码在 php 中运行相同的查询,但无法使其工作:
$criteria = array(
"userEmail" => array(
'$nin' => array(
'$regex' => new \MongoRegex("/@test_mail.com|@company_mail.com/i")
)
)
);
$cursor = $collection->find($criteria);
有什么建议吗?
【问题讨论】:
【参考方案1】:正确的应用方法是使用单个 MongoRegex 对象和 $not
运算符来反转条件:
$cursor = $users->find(array(
"userEmail" => array(
'$not' => new MongoRegex('/\@test_mail\.com$|\@company_mail\.com$/i')
)
));
foreach ( $cursor as $doc )
var_dump( $doc );
这同样适用于$nin
,您实际上可以指定“正则表达式”参数,但它必须是正则表达式“对象”类型,而不是运算符形式:
$cursor = $user->find(array(
"userEmail" => array(
'$nin' => array(new MongoRegex('/\@test_mail\.com$|\@company_mail\.com$/i'))
)
));
foreach ( $cursor as $doc )
var_dump( $doc );
但不是真的有必要,因为您没有提供不同值的“数组”,正则表达式可以表示“或”条件本身。
【讨论】:
【参考方案2】:在这种情况下你不应该使用 $nin,我会尝试这样的事情:
$criteria = array(
"userEmail" => array(
'$not' => array(
'$or' => array(
'$regex' => new \MongoRegex("/@test_mail\.com$/i"),
'$regex' => new \MongoRegex("/@company_mail\.com$/i"),
),
),
)
);
更新:
你可以试试这个:
$criteria = array(
'$not' => array(
'$or' => array(
"userEmail" => array('$regex' => new \MongoRegex("/@test_mail\.com$/i")),
"userEmail" => array('$regex' => new \MongoRegex("/@company_mail\.com$/i")),
),
),
)
);
【讨论】:
感谢您的建议,但是当我使用您的代码时,我得到了以下 MongoCursorException:$not 的无效使用 现在我得到“无效的运算符:$or”MongoCursorException 和更新的代码以上是关于在 MongoDB 中通过 PHP 使用 NotIn 和正则表达式的主要内容,如果未能解决你的问题,请参考以下文章
在从 SQL 到 MongoDB 运行 ETL 中通过 LEFT JOIN 添加新字段