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
studentIdet 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
studentIdComptableau. - Maintenant, prenez ces documents et créez une nouvelle projection de document, qui continue d'avoir le
studentIdet ajoute un nouveau champ appeléisStudentEqualqui compare l'égalité de deux champs, lestudentIdetstudentIdComp. N'oubliez pas qu'à ce stade, il existe un seul document temporaire contenant ces deux champs. - Enfin, vérifiez que la valeur de comparaison
isStudentEqualest vrai et renvoie ces documents (qui contiendront le document d'origine_idet lestudentId. - Si l'étudiant figurait plusieurs fois dans la liste, vous devrez peut-être regrouper les résultats sur
studentIdou_idpour éviter les doublons (mais je ne sais pas si vous en auriez besoin).