在 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 和正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

在 mongoDB 中通过属性构建进行分组

在 Mongodb 中通过 ObjectId 查找有多快?

PHP7 pecl 安装 mongodb扩展

在从 SQL 到 MongoDB 运行 ETL 中通过 LEFT JOIN 添加新字段

在 pentaho CDE 中通过kettleTransFromFile 将参数传递给 pentaho 水壶

如何在 php 中通过 gmail 使用 mail()