Si possible, je vous suggère de définir la condition lors du stockage des données afin de pouvoir effectuer une vérification rapide de la vérité (isInStudentsList
). Ce serait super rapide de faire ce type de requête.
Sinon, il existe une manière relativement complexe d'utiliser le pipeline du framework d'agrégation pour faire ce que vous voulez dans une seule requête :
db.students.aggregate(
{$project:
{studentId: 1, studentIdComp: "$students.id"}},
{$unwind: "$studentIdComp"},
{$project : { studentId : 1,
isStudentEqual: { $eq : [ "$studentId", "$studentIdComp" ] }}},
{$match: {isStudentEqual: true}})
Étant donné votre exemple d'entrée, la sortie serait :
{
"result" : [
{
"_id" : ObjectId("517b88decd483543a8bdd95b"),
"studentId" : 23,
"isStudentEqual" : true
}
],
"ok" : 1
}
Une brève explication des étapes :
- Construire une projection du document avec seulement
studentId
et un nouveau champ avec un tableau contenant uniquement leid
(donc le premier document contiendrait[23, 55]
. - En utilisant cette structure, $unwind
. Cela crée un nouveau document temporaire pour chaque élément du tableau dans le
studentIdComp
tableau. - Maintenant, prenez ces documents et créez une nouvelle projection de document, qui continue d'avoir le
studentId
et ajoute un nouveau champ appeléisStudentEqual
qui compare l'égalité de deux champs, lestudentId
etstudentIdComp
. N'oubliez pas qu'à ce stade, il existe un seul document temporaire contenant ces deux champs. - Enfin, vérifiez que la valeur de comparaison
isStudentEqual
est vrai et renvoie ces documents (qui contiendront le document d'origine_id
et lestudentId
. - Si l'étudiant figurait plusieurs fois dans la liste, vous devrez peut-être regrouper les résultats sur
studentId
ou_id
pour éviter les doublons (mais je ne sais pas si vous en auriez besoin).