Использование NotIn & amp; Regex в MongoDB с переполнением стека

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

    [email protected]
test@test_mail.com
test2@test_mail.com
admin@company_mail.com
[email protected]
sales@company_mail.com
[email protected]

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

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

Какие-либо предложения?

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 где вы можете указать аргумент «regex», но это должен быть тип «object» регулярного выражения, а не форма оператора:

$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

Другие решения

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

$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

По вопросам рекламы [email protected]