2012-06-28 7 views
3

Il est struct de mes documents MongoDB:Comment obtenir un objet spécifique à partir d'un tableau d'objets dans un document MongoDB spécifique?

{ 
    _id : "12345", 
    name : "foo", 
    object : { 
     array_of_objects : [{ 
      id : 507, 
      name : "some name", 
      dt : "2012-06-27 16:35:50" 
     },{ 
      id : 506 
      name : "some other name", 
      dt : "2012-06-21 16:09:05" 
     }, 
     … 
     ] 
    } 
} 

je dois obtenir un objet de array_of_objects avec un certain identifiant du document avec le nom spécifié . J'utilise php et a essayé d'exécuter le code suivant:

$collection->find(array('name' => 'foo', 'object.array_of_objects.id' => 507)); 

Il renvoie tous les éléments de array_of_objects au lieu de l'élément avec id 507. Après que je tente de faire requête avec elemMatch $:

$collection->find(array('name' => 'foo', 'object.array_of_objects' => array('$elemMatch' => array('id' => 507)))); 

Mais il avait le même retour. . :( Mon MongoDB Version 2.0.6 S'il vous plaît aider

+0

Inconvénient de MongoDB: http://stackoverflow.com/questions/10042097/how-to-search-data-in-inner-array-in-mongodb –

+0

@ david-cheung merci! Donc, je vais essayer de le faire avec Mapreduce. – bibimij

Répondre

3

Ce problème a été résolu et sera disponible dans la version 2.2 MongoDB, la prochaine version stable: https://jira.mongodb.org/browse/SERVER-828

Je viens de l'essayer en utilisant MongoDB 2.1.2 (unstable, developme nt release):

échantillon doc:

{ "_id" : 1, "object" : { "array" : [ { "id" : 507, "name" : "Jenna" }, { "id" : 506, "name" : "Matt" } ] } } 

requête:

db.food.find({_id:1, "object.array.id":506},{_id:0, "object.array.$":1}) 

Résultat:

{ "object" : { "array" : [ { "id" : 506, "name" : "Matt" } ] } } 
+1

Bonne nouvelle à tous! 8) Merci, @Jenna! – bibimij

+0

Malheureusement, j'utilise http://mongohq.com, donc je ne peux pas mettre à niveau MongoDB. :( – bibimij

0

Vous ne pouvez pas le faire avec MongoDB. MongoDB ne naviguer dans un document particulier pour extraire un élément d'un tableau par exemple, vous devez le faire en . vous

maintenant, le pilote PHP peut faire plus de travail, je ne sais pas -. Je parle de questions de MongoDB

+0

Vous pouvez retourner un sous-ensemble de champs - consultez la documentation MongoDB: http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields – Jenna

+0

@Jenna oui vous avez raison - mais un élément spécifique d'un tableau en fonction de sa valeur? – Blacksad

+0

Si je comprends bien, cela peut être fait soit en obtenant l'ensemble du tableau d'objets et la recherche de l'élément désiré en utilisant PHP, ou en utilisant MapReduce, non? – bibimij

0

Alors, je l'ai fait avec MapReduce. J'espère que cela permettra d'économiser du temps et des nerfs.

$name = 'foo'; 
$id = 507; 

$mongo = new Mongo('…'); 

$db = $mongo->my_db; 

$map = new MongoCode('function(){'. 
    'this.object.array_of_objects.forEach(function(obj){'. 
     'if (obj.id == '.$id.')'. 
      'emit(1, obj);'. 
    '});}' 
); 

$reduce = new MongoCode('function(k,v){ return [k,v]; }'); 

$response = $db->command(array(
    'mapreduce' => 'my_collection', 
    'map' => $map, 
    'reduce' => $reduce, 
    'query' => array('name' => $name), 
    'out' => array('inline' => 1) 
)); 

var_dump($response['result']); 
Questions connexes