Sự khác biệt trong cách sử dụng chiếu có phần nhỏ. Trong cách sử dụng ví dụ của bạn, đây phải là các truy vấn tương đương (về cách sử dụng chỉ mục) nhưng là $elemMatch
ví dụ lặp lại các tiêu chí truy vấn một cách không cần thiết. $
phép chiếu sẽ là một lựa chọn hợp lý hơn cho ví dụ này.
Một sự khác biệt cơ bản được lưu ý trong tài liệu là mảng giới hạn lĩnh vực
cho $
dự báo:
Một số lưu ý thêm về sự khác biệt trong các toán tử phép chiếu bên dưới ...
vị trí ($
) toán tử chiếu
:
-
giới hạn nội dung của trường mảng được bao gồm trong kết quả truy vấn để chứa phần tử đầu tiên phù hợp với tài liệu truy vấn.
-
yêu cầu trường mảng phù hợp được đưa vào tiêu chí truy vấn
-
chỉ có thể được sử dụng nếu một trường mảng duy nhất xuất hiện trong tiêu chí truy vấn
-
chỉ có thể được sử dụng một lần trong phép chiếu
$elemMatch
toán tử chiếu
-
giới hạn nội dung của trường mảng được bao gồm trong kết quả truy vấn để chỉ chứa phần tử mảng đầu tiên phù hợp với điều kiện $ elemMatch .
-
không yêu cầu mảng phù hợp nằm trong tiêu chí truy vấn
-
có thể được sử dụng để so khớp nhiều điều kiện cho các phần tử mảng là tài liệu được nhúng
$elemMatch
toán tử truy vấn
Lưu ý rằng cũng có $elemMatch
toán tử truy vấn thực hiện đối sánh tương tự, nhưng trong truy vấn chứ không phải trong phép chiếu kết quả. Không có gì lạ khi thấy điều này được sử dụng kết hợp với $
phép chiếu.
Mượn ví dụ từ tài liệu nơi bạn có thể sử dụng cả hai:
db.students.find(
// use $elemMatch query operator to match multiple criteria in the grades array
{ grades: {
$elemMatch: {
mean: { $gt: 70 },
grade: { $gt: 90 }
}
}},
// use $ projection to get the first matching item in the "grades" array
{ "grades.$": 1 }
)