2017-01-04 19 views
0

У меня есть вложенный массив значений, которые выглядят так в RoboMongo;Поиск по всему массиву коллекции в MongoDB

enter image description here

Или это может быть немного яснее;

enter image description here

Есть ли способ быть в состоянии (в одном запросе) поиск по всем парам ключ/значение с регулярным выражением? Сценарий не будет знать, сколько пар ключей/значений customField есть!

До сих пор у меня на PHP;

['poco.customFields.0.value' => ['$regex' => '.*'.$query.'.*', '$options' => 'i']],

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

+0

Я уверен, что это можно сделать с помощью $ where, но не уверен в синтаксисе php, вы можете проверить $, где вы можете передать функцию javascript, которая может проходить через пары ключ-значение в массиве. –

+0

Каков ваш ожидаемый результат? Не могли бы вы добавить его в свой вопрос? – dikesh

ответ

0

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

(1) Возврат всех документов с по меньшей мере, одного значения в customFields, соответствующий шаблон:

[ 'customFields.value' => [ '$regex' => $pattern, '$options' => 'i' ]] 

(2) возвратить все документы с всех значениями в customFields, соответствующий шаблон:

[ 'customFields.value' => [ '$not' => new MongoDB\BSON\Regex('\b^(?!'.$pattern.').+', 'i') ]] 

Первый запрос не требует пояснений: перебирайте все элементы массива customFields и выполняйте проверку регулярных выражений на каждом из них. Если хотя бы один из элементов соответствует шаблону, возвращается родительский документ.

Второй вариант немного сложнее. Требование «где все элементыматч определенный шаблон» эквивалентно «где ни один элементне не соответствует определенному шаблону». Чтобы добиться двойного отрицания, мы используем $not вместе с обратным выражением регулярного выражения, созданным путем применения отрицательного lookahead к тому же запросу, который мы использовали ранее. Поскольку $not отказывается принимать строки, мы генерируем немедленное выражение регулярного выражения, используя экземпляр класса MongoDB\BSON\Regex.

Дополнительная информация о негативном взгляде может быть найдена here.

+0

это потрясающе. Я сделал несколько тестов и, похоже, работает. Я бы не подумал, что запрос будет знать, итерации через массив, а не просто ошибки. – mikelovelyuk

+0

@mikelovelyuk Я очень рад, что смог помочь. Пожалуйста, подумайте о том, чтобы принять ответ, принятый, если он полностью разрешил вашу проблему или добавил дополнительные данные, которые вы хотели бы уточнить, если они есть. – Imperator

Смежные вопросы