Hvis det er muligt, vil jeg foreslå, at du indstiller betingelsen, mens du gemmer dataene, så du kan foretage et hurtigt sandhedstjek (isInStudentsList ). Det ville være super hurtigt at lave den type forespørgsel.
Ellers er der en relativt kompleks måde at bruge Aggregation framework pipeline til at gøre, hvad du vil i en enkelt forespørgsel:
db.students.aggregate(
{$project:
{studentId: 1, studentIdComp: "$students.id"}},
{$unwind: "$studentIdComp"},
{$project : { studentId : 1,
isStudentEqual: { $eq : [ "$studentId", "$studentIdComp" ] }}},
{$match: {isStudentEqual: true}})
Givet dit input eksempel ville outputtet være:
{
"result" : [
{
"_id" : ObjectId("517b88decd483543a8bdd95b"),
"studentId" : 23,
"isStudentEqual" : true
}
],
"ok" : 1
}
En kort forklaring af trinene:
- Byg en projektion af dokumentet med kun
studentIdog et nyt felt med et array, der kun indeholderid(så det første dokument ville indeholde[23, 55]. - Ved at bruge denne struktur, $unwind
. Det opretter et nyt midlertidigt dokument for hvert array-element i
studentIdComparray. - Tag nu disse dokumenter, og opret en ny dokumentprojektion, som fortsat har
studentIdog tilføjer et nyt felt kaldetisStudentEqualder sammenligner ligheden mellem to felter,studentIdogstudentIdComp. Husk, at der på dette tidspunkt er et enkelt midlertidigt dokument, der indeholder disse to felter. - Tjek endelig, at sammenligningsværdien
isStudentEqualer sand og returnerer disse dokumenter (som vil indeholde det originale dokument_idogstudentId. - Hvis eleven var på listen flere gange, skal du muligvis gruppere resultaterne på
studentIdeller_idfor at forhindre dubletter (men jeg ved ikke, at du har brug for det).