MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

übereinstimmende Felder intern in Mongodb

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:

  1. Erstellen Sie eine Projektion des Dokuments mit nur studentId und ein neues Feld mit einem Array, das nur die id enthält (Das erste Dokument würde also [23, 55] enthalten .
  2. Mit dieser Struktur $unwind . Dadurch wird ein neues temporäres Dokument für jedes Array-Element in studentIdComp erstellt Array.
  3. Nehmen Sie nun diese Dokumente und erstellen Sie eine neue Dokumentprojektion, die weiterhin die studentId hat und fügt ein neues Feld namens isStudentEqual hinzu die die Gleichheit zweier Felder vergleicht, die studentId und studentIdComp . Denken Sie daran, dass es an dieser Stelle ein einziges temporäres Dokument gibt, das diese beiden Felder enthält.
  4. 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 die studentId .
  5. 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).