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
studentId
og 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
studentIdComp
array. - Tag nu disse dokumenter, og opret en ny dokumentprojektion, som fortsat har
studentId
og tilføjer et nyt felt kaldetisStudentEqual
der sammenligner ligheden mellem to felter,studentId
ogstudentIdComp
. Husk, at der på dette tidspunkt er et enkelt midlertidigt dokument, der indeholder disse to felter. - Tjek endelig, at sammenligningsværdien
isStudentEqual
er sand og returnerer disse dokumenter (som vil indeholde det originale dokument_id
ogstudentId
. - Hvis eleven var på listen flere gange, skal du muligvis gruppere resultaterne på
studentId
eller_id
for at forhindre dubletter (men jeg ved ikke, at du har brug for det).