Vous avez une syntaxe dans votre exemple d'origine qui ne fait probablement pas ce que vous attendez .. c'est-à-dire qu'il semble que votre intention était de ne faire correspondre les scores que pour un type spécifique ("examen" dans votre exemple, "quiz" par votre description ).
Vous trouverez ci-dessous quelques exemples utilisant le shell MongoDB 2.2.
$elemMatch
projection
Vous pouvez utiliser la projection $elemMatch pour renvoyer le premier élément correspondant dans un tableau :
db.students.find(
// Search criteria
{ '_id': 22 },
// Projection
{ _id: 0, scores: { $elemMatch: { type: 'exam' } }}
)
Le résultat sera l'élément correspondant du tableau pour chaque document, par exemple :
{ "scores" : [ { "type" : "exam", "score" : 75.04996547553947 } ] }
Cadre d'agrégation
Si vous souhaitez afficher plusieurs valeurs correspondantes ou remodeler le document de résultat au lieu de renvoyer l'élément de tableau correspondant complet, vous pouvez utiliser le Framework d'agrégation :
db.students.aggregate(
// Initial document match (uses index, if a suitable one is available)
{ $match: {
'_id': 22, 'scores.type' : 'exam'
}},
// Convert embedded array into stream of documents
{ $unwind: '$scores' },
// Only match scores of interest from the subarray
{ $match: {
'scores.type' : 'exam'
}},
// Note: Could add a `$group` by _id here if multiple matches are expected
// Final projection: exclude fields with 0, include fields with 1
{ $project: {
_id: 0,
score: "$scores.score"
}}
)
Le résultat dans ce cas inclut serait :
{ "result" : [ { "score" : 75.04996547553947 } ], "ok" : 1 }