Indien mogelijk raad ik u aan de voorwaarde in te stellen terwijl u de gegevens opslaat, zodat u een snelle waarheidscheck kunt doen (isInStudentsList
). Het zou supersnel zijn om dat soort zoekopdrachten uit te voeren.
Anders is er een relatief complexe manier om de Aggregation Framework-pijplijn te gebruiken om te doen wat u wilt in een enkele query:
db.students.aggregate(
{$project:
{studentId: 1, studentIdComp: "$students.id"}},
{$unwind: "$studentIdComp"},
{$project : { studentId : 1,
isStudentEqual: { $eq : [ "$studentId", "$studentIdComp" ] }}},
{$match: {isStudentEqual: true}})
Gegeven uw invoervoorbeeld zou de uitvoer zijn:
{
"result" : [
{
"_id" : ObjectId("517b88decd483543a8bdd95b"),
"studentId" : 23,
"isStudentEqual" : true
}
],
"ok" : 1
}
Een korte uitleg van de stappen:
- Bouw een projectie van het document met slechts
studentId
en een nieuw veld met een array die alleen deid
. bevat (dus het eerste document zou[23, 55]
bevatten . - Met behulp van die structuur, $unwind
. Dat creëert een nieuw tijdelijk document voor elk array-element in de
studentIdComp
reeks. - Neem nu die documenten en maak een nieuwe documentprojectie, die nog steeds de
studentId
heeft en voegt een nieuw veld toe met de naamisStudentEqual
die de gelijkheid van twee velden vergelijkt, destudentId
enstudentIdComp
. Onthoud dat er op dit moment een enkel tijdelijk document is dat deze twee velden bevat. - Controleer ten slotte of de vergelijkingswaarde
isStudentEqual
waar is en retourneer die documenten (die het originele document_id
zullen bevatten en destudentId
. - Als de leerling meerdere keren in de lijst stond, moet je de resultaten mogelijk groeperen op
studentId
of_id
om duplicaten te voorkomen (maar ik weet niet of je dat nodig hebt).