Ve svém původním příkladu máte nějakou syntaxi, která pravděpodobně nedělá to, co očekáváte. To znamená, že to vypadá, že vaším záměrem bylo přiřadit skóre pouze pro konkrétní typ („zkouška“ ve vašem příkladu, „kvíz“ podle vašeho popisu ).
Níže jsou uvedeny některé příklady použití prostředí MongoDB 2.2.
$elemMatch
projekce
Můžete použít projekci $elemMatch vrátit první odpovídající prvek v poli:
db.students.find(
// Search criteria
{ '_id': 22 },
// Projection
{ _id: 0, scores: { $elemMatch: { type: 'exam' } }}
)
Výsledkem bude odpovídající prvek pole pro každý dokument, např.:
{ "scores" : [ { "type" : "exam", "score" : 75.04996547553947 } ] }
Agregační rámec
Chcete-li zobrazit více než jednu odpovídající hodnotu nebo změnit tvar výsledného dokumentu namísto vracení úplného shodného prvku pole, můžete použít Agregační rámec :
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"
}}
)
Výsledkem v tomto případě by bylo:
{ "result" : [ { "score" : 75.04996547553947 } ], "ok" : 1 }