2011-12-19 7 views
3

Je cherche un moyen de rechercher un mot-clé (ex. « Henrik ») dans le tableau « réponses » des documents avec la structure suivanteMongodb php query, recherche dans le tableau?

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 
    ) 

) 

Je travaille en PHP sur ce projet, et Quering comme cela fonctionne bien sûr:

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

ce que je veux faire est de rechercher sans clé spécifique du tableau de réponses, comme ce

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

est-il possi ble de faire ce type de requête? Je suis désolé si c'est un repos. Je n'ai pas pu trouver d'exemples à ce sujet ici ou sur Google.

+0

susceptibles de vous intéresser: http://stackoverflow.com/questions/6179871/mongodb-wildcard-in-the-key-of-a-query – Flukey

+0

Avez-vous lu cela? http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-ValueinanArray – Ben

Répondre

5

Je ne pense pas que ce soit possible. "Answers", étant un tableau de documents (comme vous le dites), a besoin de savoir où dans les documents qu'il contient pour rechercher la valeur que vous spécifiez.

Je suppose que ce que vous voulez faire est de chercher 'Henrik' sur l'un des champs des documents dans "réponses". Dans ce cas, je pense que le mieux est d'utiliser $ ou:

$answers = $collection->find(array('formId' => 6, '$or' => array('answers.field1'=> 'Henrik', 'answers.field6' => 'Henrik', 'answers.field7' => 'Henrik'))); 
+0

Je suppose que c'est le plus proche que je viendrai, et cela pourrait fonctionner pour moi. Merci! – Henkealg

2

Pas une solution, mais une solution de contournement: en supposant que vos clés sont aussi arbitraires que field1, field6, vous pouvez cesser d'utiliser les touches et stocker les valeurs un tableau normal:

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

Dans ce cas, votre requête:

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

trouverait des documents où se trouvait l'une des réponses 'Henrik'.

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

Ceci est la réponse correcte, de nos jours, le conducteur fonctionne parfaitement avec cette –