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
studentIdoch 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
studentIdComparray. - Ta nu dessa dokument och skapa en ny dokumentprojektion, som fortsätter att ha
studentIdoch lägger till ett nytt fält som heterisStudentEqualsom jämför likheten mellan två fält,studentIdochstudentIdComp. 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_idochstudentId. - Om eleven fanns i listan flera gånger kan du behöva gruppera resultaten på
studentIdeller_idför att förhindra dubbletter (men jag vet inte att du skulle behöva det).