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
studentIddan 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
studentIdCompsusunan. - Sekarang, ambil dokumen-dokumen itu, dan buat proyeksi dokumen baru, yang terus memiliki
studentIddan menambahkan bidang baru bernamaisStudentEqualyang membandingkan kesetaraan dua bidang,studentIddanstudentIdComp. Ingatlah bahwa saat ini ada satu dokumen sementara yang berisi dua bidang tersebut. - Terakhir, periksa apakah nilai perbandingan
isStudentEqualbenar dan kembalikan dokumen-dokumen itu (yang akan berisi dokumen asli_iddanstudentId. - Jika siswa ada dalam daftar beberapa kali, Anda mungkin perlu mengelompokkan hasilnya di
studentIdatau_iduntuk mencegah duplikat (tetapi saya tidak tahu Anda membutuhkannya).