MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

campi corrispondenti internamente in mongodb

Se possibile, ti suggerisco di impostare la condizione durante la memorizzazione dei dati in modo da poter eseguire un rapido controllo della verità (isInStudentsList ). Sarebbe super veloce eseguire quel tipo di query.

In caso contrario, esiste un modo relativamente complesso di utilizzare la pipeline del framework di aggregazione per eseguire ciò che desideri in una singola query:

db.students.aggregate( 
    {$project: 
        {studentId: 1, studentIdComp: "$students.id"}},  
    {$unwind: "$studentIdComp"}, 
    {$project : { studentId : 1, 
        isStudentEqual: { $eq : [ "$studentId", "$studentIdComp" ] }}}, 
    {$match: {isStudentEqual: true}})

Dato il tuo esempio di input, l'output sarebbe:

{
    "result" : [
         {
             "_id" : ObjectId("517b88decd483543a8bdd95b"),
             "studentId" : 23,
             "isStudentEqual" : true
         }
    ],
    "ok" : 1
}

Una breve spiegazione dei passaggi:

  1. Crea una proiezione del documento solo con studentId e un nuovo campo con un array contenente solo l'id (quindi il primo documento conterrebbe [23, 55] .
  2. Utilizzando questa struttura, $unwind . Ciò crea un nuovo documento temporaneo per ogni elemento dell'array in studentIdComp matrice.
  3. Ora prendi quei documenti e crea una nuova proiezione del documento, che continua ad avere lo studentId e aggiunge un nuovo campo chiamato isStudentEqual che confronta l'uguaglianza di due campi, lo studentId e studentIdComp . Ricorda che a questo punto esiste un unico documento temporaneo che contiene quei due campi.
  4. Infine, controlla che il valore di confronto isStudentEqual è true e restituire quei documenti (che conterranno il documento originale _id e studentId .
  5. Se lo studente era nell'elenco più volte, potresti dover raggruppare i risultati su studentId o _id per evitare duplicati (ma non so se ne avresti bisogno).