Jika memungkinkan, saya sarankan Anda mengatur kondisi saat menyimpan data sehingga Anda dapat melakukan pemeriksaan kebenaran dengan cepat (isInStudentsList
). Akan sangat cepat untuk melakukan jenis kueri seperti itu.
Jika tidak, ada cara yang relatif rumit dalam menggunakan alur kerangka kerja Agregasi untuk melakukan apa yang Anda inginkan dalam satu kueri:
db.students.aggregate(
{$project:
{studentId: 1, studentIdComp: "$students.id"}},
{$unwind: "$studentIdComp"},
{$project : { studentId : 1,
isStudentEqual: { $eq : [ "$studentId", "$studentIdComp" ] }}},
{$match: {isStudentEqual: true}})
Diberikan contoh input Anda, outputnya adalah:
{
"result" : [
{
"_id" : ObjectId("517b88decd483543a8bdd95b"),
"studentId" : 23,
"isStudentEqual" : true
}
],
"ok" : 1
}
Penjelasan singkat langkah-langkahnya:
- Buat proyeksi dokumen hanya dengan
studentId
dan bidang baru dengan larik yang hanya berisiid
(jadi dokumen pertama akan berisi[23, 55]
. - Dengan menggunakan struktur tersebut, $unwind
. Itu membuat dokumen sementara baru untuk setiap elemen array di
studentIdComp
susunan. - Sekarang, ambil dokumen-dokumen itu, dan buat proyeksi dokumen baru, yang terus memiliki
studentId
dan menambahkan bidang baru bernamaisStudentEqual
yang membandingkan kesetaraan dua bidang,studentId
danstudentIdComp
. Ingatlah bahwa saat ini ada satu dokumen sementara yang berisi dua bidang tersebut. - Terakhir, periksa apakah nilai perbandingan
isStudentEqual
benar dan kembalikan dokumen-dokumen itu (yang akan berisi dokumen asli_id
danstudentId
. - Jika siswa ada dalam daftar beberapa kali, Anda mungkin perlu mengelompokkan hasilnya di
studentId
atau_id
untuk mencegah duplikat (tetapi saya tidak tahu Anda membutuhkannya).