PHP-запрос MongoDB, поиск в массиве?

Я ищу способ поиска ключевого слова (например, «Хенрик») в массиве документов «ответы» со следующей структурой

Array
(
[_id] => MongoId Object
    (
        [$id] => 4eeedd9545c717620a000007
    )

[formId] => 6
[respId] => 4eeedd95c93228
[dateCreated] => 2011-10-14 07:45
[answers] => Array
    (
        [field1] => Henrik
        [field6] => [email protected]
        [field7] => my city address
    )

)

Я работаю в PHP над этим проектом, и, конечно, такой запрос работает:

$answers = $collection->find( array('formId' => 6, 'answers.field1'=> 'Henrik' ) );

То, что я хочу сделать, это поиск без определенного ключа массива ответов, например

$answers = $collection->find( array('formId' => 6, 'answers'=> 'Henrik' ) );

Можно ли сделать такой запрос? Прошу прощения, если это репост. Я не смог найти никаких примеров по этому поводу ни здесь, ни в Google.


person Henkealg    schedule 19.12.2011    source источник
comment
Вам может быть интересно: stackoverflow.com/questions/6179871/   -  person Flukey    schedule 19.12.2011
comment
Вы читали это? mongodb.org/display/DOCS/   -  person Ben    schedule 19.12.2011


Ответы (3)


Я не думаю, что это возможно сделать.

«ответы», будучи массивом документов (как вы говорите), должны знать, где в содержащихся в нем документах искать указанное вами значение.

Я предполагаю, что вы хотите найти «Хенрик» в любом из полей документов в «ответах». В этом случае я думаю, что лучше всего использовать $or:

$answers = $collection->find( array('formId' => 6, '$or' => array('answers.field1'=> 'Henrik', 'answers.field6' => 'Henrik', 'answers.field7' => 'Henrik')));
person civilu    schedule 19.12.2011
comment
Я думаю, что это самое близкое, что я подойду, и это может сработать для меня. Спасибо! - person Henkealg; 22.12.2011

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

'answers' => array(
    'Henrik',
    '[email protected]',
    'my city address'
)

В этом случае ваш запрос:

$answers = $collection->find( array('formId' => 6, 'answers'=> 'Henrik' ) );

найдут документы, где «Хенрик» был одним из ответов.

person Dave Lancea    schedule 19.12.2011

person    schedule
comment
Это правильный ответ, в настоящее время драйвер отлично работает с этим - person lesolorzanov; 09.04.2014