0

我有一个包含一些用户电子邮件地址的表格,例如:

    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);

有什么建议么?

4

2 回答 2

0

在这种情况下你不应该使用 $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")),
        ),
    ),
    )
);
于 2014-10-02T08:41:00.983 回答
0

应用它的正确方法是使用单个 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 );
}

但并非真正必要,因为您没有提供不同值的“数组”,正则表达式可以表示“或”条件本身。

于 2014-10-02T09:41:18.460 回答