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:
- 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]
. - Utilizzando questa struttura, $unwind
. Ciò crea un nuovo documento temporaneo per ogni elemento dell'array in
studentIdComp
matrice. - Ora prendi quei documenti e crea una nuova proiezione del documento, che continua ad avere lo
studentId
e aggiunge un nuovo campo chiamatoisStudentEqual
che confronta l'uguaglianza di due campi, lostudentId
estudentIdComp
. Ricorda che a questo punto esiste un unico documento temporaneo che contiene quei due campi. - Infine, controlla che il valore di confronto
isStudentEqual
è true e restituire quei documenti (che conterranno il documento originale_id
estudentId
. - 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).