Wenn möglich, würde ich vorschlagen, dass Sie die Bedingung beim Speichern der Daten festlegen, damit Sie eine schnelle Wahrheitsprüfung durchführen können (isInStudentsList
). Es wäre superschnell, diese Art von Abfrage durchzuführen.
Andernfalls gibt es eine relativ komplexe Möglichkeit, die Aggregation-Framework-Pipeline zu verwenden, um in einer einzigen Abfrage das zu tun, was Sie wollen:
db.students.aggregate(
{$project:
{studentId: 1, studentIdComp: "$students.id"}},
{$unwind: "$studentIdComp"},
{$project : { studentId : 1,
isStudentEqual: { $eq : [ "$studentId", "$studentIdComp" ] }}},
{$match: {isStudentEqual: true}})
Bei Ihrem Eingabebeispiel wäre die Ausgabe:
{
"result" : [
{
"_id" : ObjectId("517b88decd483543a8bdd95b"),
"studentId" : 23,
"isStudentEqual" : true
}
],
"ok" : 1
}
Eine kurze Erklärung der Schritte:
- Erstellen Sie eine Projektion des Dokuments mit nur
studentId
und ein neues Feld mit einem Array, das nur dieid
enthält (Das erste Dokument würde also[23, 55]
enthalten . - Mit dieser Struktur $unwind
. Dadurch wird ein neues temporäres Dokument für jedes Array-Element in
studentIdComp
erstellt Array. - Nehmen Sie nun diese Dokumente und erstellen Sie eine neue Dokumentprojektion, die weiterhin die
studentId
hat und fügt ein neues Feld namensisStudentEqual
hinzu die die Gleichheit zweier Felder vergleicht, diestudentId
undstudentIdComp
. Denken Sie daran, dass es an dieser Stelle ein einziges temporäres Dokument gibt, das diese beiden Felder enthält. - Prüfen Sie abschließend, ob der Vergleichswert
isStudentEqual
ist wahr ist und diese Dokumente zurückgibt (die das ursprüngliche Dokument_id
enthalten und diestudentId
. - Wenn der Schüler mehrmals in der Liste war, müssen Sie die Ergebnisse möglicherweise nach
studentId
gruppieren oder_id
um Duplikate zu verhindern (aber ich weiß nicht, ob Sie das brauchen).