MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Récupérer une seule propriété du document

Dans MongoDB 2.0 et versions antérieures, ce n'est pas possible. Ce que vous voulez faire, c'est renvoyer un élément spécifique du tableau - mais ce n'est pas ce que votre projection fait réellement, elle renverra simplement le tableau entier, puis l'élément z de chacun.

Cependant, avec 2.2 (rc2 au moment d'écrire cette réponse), les choses se sont un peu améliorées. Vous pouvez désormais utiliser $elemMatch dans le cadre de votre projection (voir SERVER-2238 pour plus de détails) afin de ne retirer que l'élément de tableau requis. Alors, essayez quelque chose comme ça :

db.foo.find({"ID":"123",'a':{$elemMatch:{'x':"/"}}},{_id : 0, 'a.$': 1})
//returns
{ "a" : [ { "x" : "/", "y" : "2000", "z" : "1000" } ] }

Ou, utilisez simplement $elemMatch dans la projection elle-même, ce qui peut vous sembler plus propre :

db.foo.find({"ID":"123"},{_id : 0, 'a':{$elemMatch:{'x':"/"}}})
//returns 
{ "a" : [ { "x" : "/", "y" : "2000", "z" : "1000" } ] }

Ainsi, maintenant, au moins le tableau renvoyé est uniquement celui contenant uniquement les entrées souhaitées et vous pouvez simplement référencer l'élément z pertinent (les projections elemMatch sur un sous-document ne sont pas encore prises en charge).

Enfin, en 2.2, nous avons le framework d'agrégation, et l'une des choses qu'il peut faire (avec le $project , consiste à remodeler vos documents et à modifier les sous-documents et les éléments de tableau en tableaux de niveau supérieur. Pour obtenir le résultat souhaité, vous feriez quelque chose comme ceci :

db.foo.aggregate( 
        {$match : {"ID":"123"}},  
        {$unwind : "$a"},  
        {$match : {"a.x":"/"}},  
        {$project : {_id : 0, z : "$a.z"}}
)

Le résultat ressemble à ceci :

{ "result" : [ { "z" : "1000" } ], "ok" : 1 }