W oryginalnym przykładzie masz pewną składnię, która prawdopodobnie nie spełnia oczekiwań, to znaczy wygląda na to, że Twoim zamiarem było dopasowanie wyników tylko dla określonego typu (w przykładzie „egzamin”, „quiz” według opisu ).
Poniżej znajduje się kilka przykładów użycia powłoki MongoDB 2.2.
$elemMatch
projekcja
Możesz użyć projekcja $elemMatch aby zwrócić pierwszy pasujący element w tablicy:
db.students.find(
// Search criteria
{ '_id': 22 },
// Projection
{ _id: 0, scores: { $elemMatch: { type: 'exam' } }}
)
Wynikiem będzie pasujący element tablicy dla każdego dokumentu, np.:
{ "scores" : [ { "type" : "exam", "score" : 75.04996547553947 } ] }
Struktura agregacji
Jeśli chcesz wyświetlić więcej niż jedną pasującą wartość lub zmienić kształt dokumentu wynikowego zamiast zwracać pełny pasujący element tablicy, możesz użyć Struktura agregacji :
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"
}}
)
Wynik w tym przypadku obejmuje:
{ "result" : [ { "score" : 75.04996547553947 } ], "ok" : 1 }