2014-10-02 3 views
0

У меня есть таблица с некоторым пользователем адрес электронной почты, как:Использование NotIn & Regex в MongoDB с PHP

[email protected] 
    [email protected]_mail.com 
    [email protected]_mail.com 
    [email protected]_mail.com 
    [email protected] 
    [email protected]_mail.com 
    [email protected] 

Я хочу, чтобы получить список пользователей с электронной почты не заканчивается @ test_mail.com OR @ company_mail.com , мне удалось это с помощью следующего запроса Монго:

db.users.find({ 
    userEmail: { 
     $nin: [/@test_mail.com$/,/@company_mail.com$/] 
    } 
}) 

Я TrID запустить тот же запрос в PHP с следующим кодом, но не мог заставить его работать:

$criteria = array(
    "userEmail" => array(
     '$nin' => array(
      '$regex' => new \MongoRegex("/@test_mail.com|@company_mail.com/i") 
     ) 
    ) 
); 
$cursor = $collection->find($criteria); 

Любые предложения?

ответ

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

Но на самом деле не нужно, как вы не предоставляют «массив» разных значений, регулярное выражение может представлять собой «или» условие.

+0

Спасибо, те отлично работают – emrec

0

Вы не должны использовать $ нин в этом случае, я хотел бы попробовать что-то вроде этого:

$criteria = array(
    "userEmail" => array(
     '$not' => array(
      '$or' => array(
       '$regex' => new \MongoRegex("/@test_mail\.com$/i"), 
       '$regex' => new \MongoRegex("/@company_mail\.com$/i"), 
      ), 
     ), 
    ) 
); 

UPD:

вы можете попробовать это:

$criteria = array(
    '$not' => array(
     '$or' => array(
      "userEmail" => array('$regex' => new \MongoRegex("/@test_mail\.com$/i")), 
      "userEmail" => array('$regex' => new \MongoRegex("/@company_mail\.com$/i")), 
     ), 
    ), 
    ) 
); 
+0

Благодарим за предложение, но я воспользовался кодом MongoCursorException, когда использовал ваш код: Недопустимое использование $ not – emrec

+0

См. Обновление выше. –

+0

Теперь я получаю «недействительный оператор: $ или« MongoCursorException с обновленным кодом – emrec