Bạn có một số cú pháp trong ví dụ ban đầu có thể không làm được những gì bạn mong đợi .. nghĩa là, có vẻ như mục đích của bạn là chỉ khớp điểm cho một loại cụ thể ('kỳ thi' trong ví dụ của bạn, 'bài kiểm tra' theo mô tả của bạn ).
Dưới đây là một số ví dụ sử dụng trình bao MongoDB 2.2.
$elemMatch
phép chiếu
Bạn có thể sử dụng phép chiếu $ elemMatch để trả về phần tử phù hợp đầu tiên trong một mảng:
db.students.find(
// Search criteria
{ '_id': 22 },
// Projection
{ _id: 0, scores: { $elemMatch: { type: 'exam' } }}
)
Kết quả sẽ là phần tử phù hợp của mảng cho mỗi tài liệu, ví dụ:
{ "scores" : [ { "type" : "exam", "score" : 75.04996547553947 } ] }
Khung tổng hợp
Nếu bạn muốn hiển thị nhiều giá trị phù hợp hoặc định hình lại tài liệu kết quả thay vì trả về phần tử mảng phù hợp đầy đủ, bạn có thể sử dụng Khung tổng hợp :
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"
}}
)
Kết quả trong trường hợp này bao gồm sẽ là:
{ "result" : [ { "score" : 75.04996547553947 } ], "ok" : 1 }