Имате някакъв синтаксис в оригиналния си пример, който вероятно не прави това, което очаквате .. т.е. изглежда, че намерението ви е било да съпоставите резултати само за определен тип („изпит“ във вашия пример, „тест“ според вашето описание ).
По-долу са някои примери за използване на обвивката на MongoDB 2.2.
$elemMatch
проекция
Можете да използвате проекцията $elemMatch за връщане на първия съответстващ елемент в масив:
db.students.find(
// Search criteria
{ '_id': 22 },
// Projection
{ _id: 0, scores: { $elemMatch: { type: 'exam' } }}
)
Резултатът ще бъде съвпадащият елемент от масива за всеки документ, напр.:
{ "scores" : [ { "type" : "exam", "score" : 75.04996547553947 } ] }
Рамка за агрегиране
Ако искате да покажете повече от една съответстваща стойност или да промените формата на резултатния документ, вместо да върнете пълния съответстващ елемент на масива, можете да използвате 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"
}}
)
Резултатът в този случай включва:
{ "result" : [ { "score" : 75.04996547553947 } ], "ok" : 1 }