Jika Anda hanya ingin memilih bidang tertentu dari array untuk dikembalikan, maka Anda berbicara tentang "membentuk kembali" dokumen. Untuk apa pun di luar pemilihan bidang "dasar", ini berarti menggunakan .aggregate()
sebagai metode alih-alih .find()
.
Jadi dua persyaratan di sini adalah untuk $filter
pada konten array untuk "mencocokkan" dan kembali, serta $map
"bidang yang akan dikembalikan" yang sebenarnya dari larik itu sendiri:
User.aggregate([
{ "$match": { "children.name": "def" } },
{ "$project": {
"name": 1,
"children": {
"$map": {
"input": {
"$filter": {
"input": "$children",
"as": "c",
"cond": { "$eq": [ "$$c.name", "def" ] }
}
},
"as": "c",
"in": {
"age": "$$c.age",
"height": "$$c.height"
}
}
}
}}
])
Di sini $filter
digunakan untuk mengurangi isi array menjadi hanya yang cocok dengan kondisi. Menjadi mereka yang memiliki "name"
yang sama properti sebagai nilai "def"
. Ini kemudian diteruskan sebagai "input"
parameter ke$map
.
$map
operator berfungsi seperti rekan bahasa lainnya karena "membentuk ulang array" untuk mengembalikan sesuatu sesuai dengan apa yang Anda tentukan di "in"
parameter. Jadi di sini kita sebenarnya hanya secara eksplisit menamai properti dan menggunakan penetapan variabel di sana untuk elemen larik saat ini yang sedang diproses sehingga inilah yang dikembalikan sebagai konten larik "baru".
Hasil keseluruhan adalah array, berisi:
- Hanya item yang cocok dengan ketentuan yang ditentukan.
- Hanya bidang yang ditentukan untuk ditampilkan.