Om möjligt skulle jag föreslå att du ställer in villkoret medan du lagrar data så att du kan göra en snabb sanningskontroll (isInStudentsList
). Det skulle gå supersnabbt att göra den typen av frågor.
Annars finns det ett relativt komplicerat sätt att använda Aggregation-ramverket för att göra vad du vill i en enda fråga:
db.students.aggregate(
{$project:
{studentId: 1, studentIdComp: "$students.id"}},
{$unwind: "$studentIdComp"},
{$project : { studentId : 1,
isStudentEqual: { $eq : [ "$studentId", "$studentIdComp" ] }}},
{$match: {isStudentEqual: true}})
Med ditt inmatningsexempel skulle utdata vara:
{
"result" : [
{
"_id" : ObjectId("517b88decd483543a8bdd95b"),
"studentId" : 23,
"isStudentEqual" : true
}
],
"ok" : 1
}
En kort förklaring av stegen:
- Skapa en projektion av dokumentet med bara
studentId
och ett nytt fält med en array som bara innehållerid
(så det första dokumentet skulle innehålla[23, 55]
. - Med den strukturen, $unwind
. Det skapar ett nytt temporärt dokument för varje arrayelement i
studentIdComp
array. - Ta nu dessa dokument och skapa en ny dokumentprojektion, som fortsätter att ha
studentId
och lägger till ett nytt fält som heterisStudentEqual
som jämför likheten mellan två fält,studentId
ochstudentIdComp
. Kom ihåg att det vid det här laget finns ett enda temporärt dokument som innehåller dessa två fält. - Kontrollera slutligen att jämförelsevärdet
isStudentEqual
är sant och returnerar dessa dokument (som kommer att innehålla originaldokumentet_id
ochstudentId
. - Om eleven fanns i listan flera gånger kan du behöva gruppera resultaten på
studentId
eller_id
för att förhindra dubbletter (men jag vet inte att du skulle behöva det).