Perbedaan dalam penggunaan proyeksi agak halus. Dalam contoh penggunaan Anda, ini harus berupa kueri yang setara (dalam hal penggunaan indeks) tetapi $elemMatch
contoh tidak perlu mengulangi kriteria kueri. $
proyeksi akan menjadi pilihan yang lebih masuk akal untuk contoh ini.
Perbedaan penting yang dicatat dalam dokumentasi adalah array batasan bidang
untuk $
proyeksi:
Beberapa catatan lebih lanjut tentang perbedaan operator proyeksi di bawah ini ...
The posisional ($
) operator proyeksi
:
-
membatasi konten bidang larik yang disertakan dalam hasil kueri agar berisi elemen pertama yang cocok dengan dokumen kueri.
-
mengharuskan bidang larik yang cocok disertakan dalam kriteria kueri
-
hanya dapat digunakan jika satu bidang larik muncul dalam kriteria kueri
-
hanya dapat digunakan sekali dalam proyeksi
The $elemMatch
operator proyeksi
-
membatasi konten bidang larik yang disertakan dalam hasil kueri agar hanya berisi elemen larik pertama yang cocok dengan kondisi $elemMatch .
-
tidak memerlukan larik yang cocok dalam kriteria kueri
-
dapat digunakan untuk mencocokkan beberapa kondisi untuk elemen array yang merupakan dokumen yang disematkan
The $elemMatch
operator kueri
Perhatikan bahwa ada juga $elemMatch
operator kueri yang melakukan pencocokan serupa, tetapi dalam kueri daripada proyeksi hasil. Tidak jarang melihat ini digunakan dalam kombinasi dengan $
proyeksi.
Meminjam contoh dari dokumen di mana Anda dapat menggunakan keduanya:
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 }
)