MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

champs correspondants en interne dans mongodb

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 :

  1. Construire une projection du document avec seulement studentId et un nouveau champ avec un tableau contenant uniquement le id (donc le premier document contiendrait [23, 55] .
  2. En utilisant cette structure, $unwind . Cela crée un nouveau document temporaire pour chaque élément du tableau dans le studentIdComp tableau.
  3. 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, le studentId et studentIdComp . N'oubliez pas qu'à ce stade, il existe un seul document temporaire contenant ces deux champs.
  4. Enfin, vérifiez que la valeur de comparaison isStudentEqual est vrai et renvoie ces documents (qui contiendront le document d'origine _id et le studentId .
  5. 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).