Você tem alguma sintaxe em seu exemplo original que provavelmente não está fazendo o que você espera .. ou seja, parece que sua intenção era apenas corresponder pontuações para um tipo específico ('exame' em seu exemplo, 'quiz' em sua descrição ).
Abaixo estão alguns exemplos usando o shell MongoDB 2.2.
$elemMatch
projeção
Você pode usar a projeção $elemMatch para retornar o primeiro elemento correspondente em uma matriz:
db.students.find(
// Search criteria
{ '_id': 22 },
// Projection
{ _id: 0, scores: { $elemMatch: { type: 'exam' } }}
)
O resultado será o elemento correspondente do array para cada documento, por exemplo:
{ "scores" : [ { "type" : "exam", "score" : 75.04996547553947 } ] }
Estrutura de agregação
Se você deseja exibir mais de um valor correspondente ou remodelar o documento de resultado em vez de retornar o elemento de matriz correspondente completo, você pode usar o Estrutura de Agregação :
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"
}}
)
O resultado neste caso inclui seria:
{ "result" : [ { "score" : 75.04996547553947 } ], "ok" : 1 }