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
studentIde 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
studentIdCompmatrice. - Ora prendi quei documenti e crea una nuova proiezione del documento, che continua ad avere lo
studentIde aggiunge un nuovo campo chiamatoisStudentEqualche confronta l'uguaglianza di due campi, lostudentIdestudentIdComp. 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_idestudentId. - Se lo studente era nell'elenco più volte, potresti dover raggruppare i risultati su
studentIdo_idper evitare duplicati (ma non so se ne avresti bisogno).