Du har viss syntax i ditt ursprungliga exempel som förmodligen inte gör som du förväntar dig .. det vill säga, det verkar som att din avsikt var att bara matcha poäng för en specifik typ ('prov' i ditt exempel, 'quiz' enligt din beskrivning ).
Nedan finns några exempel med MongoDB 2.2-skalet.
$elemMatch
projektion
Du kan använda $elemMatch-projektionen för att returnera det första matchande elementet i en array:
db.students.find(
// Search criteria
{ '_id': 22 },
// Projection
{ _id: 0, scores: { $elemMatch: { type: 'exam' } }}
)
Resultatet blir det matchande elementet i arrayen för varje dokument, t.ex.:
{ "scores" : [ { "type" : "exam", "score" : 75.04996547553947 } ] }
Aggregation Framework
Om du vill visa mer än ett matchande värde eller omforma resultatdokumentet istället för att returnera hela matchande array-elementet, kan du använda Aggregation Framework :
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"
}}
)
Resultatet i detta fall inkluderar skulle vara:
{ "result" : [ { "score" : 75.04996547553947 } ], "ok" : 1 }