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
studentIden 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
studentIdCompreeks. - Neem nu die documenten en maak een nieuwe documentprojectie, die nog steeds de
studentIdheeft en voegt een nieuw veld toe met de naamisStudentEqualdie de gelijkheid van twee velden vergelijkt, destudentIdenstudentIdComp. Onthoud dat er op dit moment een enkel tijdelijk document is dat deze twee velden bevat. - Controleer ten slotte of de vergelijkingswaarde
isStudentEqualwaar is en retourneer die documenten (die het originele document_idzullen bevatten en destudentId. - Als de leerling meerdere keren in de lijst stond, moet je de resultaten mogelijk groeperen op
studentIdof_idom duplicaten te voorkomen (maar ik weet niet of je dat nodig hebt).