2016-04-25 7 views
2

Ich habe eine Sammlung "Studenten".Wie bekomme ich ein Feld in Objekten?

{ 
    student:"Jone Doe", 
    class:"A", 
    subjects: 
    [ 
     {subject:"Math",teacher:"Linda","score":"82"}, 
     {subject:"English",teacher:"Jone","score":"52"}, 
     {subject:"History",teacher:"Maria","score":"32"}, 
    ] 
} 
{ 
    student:"Baby Doe", 
    class:"B", 
    subjects: 
    [ 
     {subject:"Math",teacher:"Hilary","score":"52"}, 
     {subject:"English",teacher:"Notham","score":"52"}, 
     {subject:"History",teacher:"Hamet","score":"32"}, 
    ] 
} 

Und ich möchte alle Punkte des Fachs "Math" des Schülers bekommen.

Im aggregation mit

db.collection('studens').aggregate([ 
     {$match: {"subjects.subject" : "Math" } }, 
     {$project: { 
     _id:0, 
     subjects: { 
      $filter: { 
       input: "$subjects", 
       as: "subject", 
       cond: { $lte: [ "$$subject.subject", "Math" ] } 
      } 
     } 
     } 
    } 
]); 

Und das Ergebnis zu erhalten:

{subject:"Math",teacher:"Linda","score":"82"} 
{subject:"Math",teacher:"Hilary","score":"52"} 

Aber es alle Felder zeigen, und ich möchte das Ergebnis (nur zeigen Thema und Gäste):

{subject:"Math","score":"82"} 
{subject:"Math","score":"52"} 

Wie geht das? Bitte helfen Sie mir.

+0

Ok, gut ich Ihre Aggregation nur testen .. Ich bin immer: ' "Ergebnis": [{ "Themen": [ // alle Werte ] }, { "Themen": [ // alle Werte auch Englisch und anderes Thema ] } ] 'Ist das was du bekommst? – rahpuser

+0

Ändern Sie die Bedingung in $ eq und jetzt Im nur Math Betreff Dokumente bekommen .. Ist dies die Ausgabe, die Sie suchen? Ausschluss von Werten wird nicht unterstützt, also .. Sie könnten wahrscheinlich mit einer anderen Projektion versuchen, die Einbeziehung von Feldern – rahpuser

Antwort

1

Ich bin nicht sicher, wie dies getan werden sollte, da der Ausschluss nicht unterstützt wird, würde ich eine andere Projektion für die Aufnahme der gewünschten Felder verwenden. (Es gibt wahrscheinlich einen besseren Weg, dies zu tun).

Lets try this:

db.collection('studens').aggregate([ 
     {$match: {"subjects.subject" : "Math" } }, 
     {$project: { 
      _id:0, 
      subjects: { 
       $filter: { 
        input: '$subjects', 
        as: 'subjects', 
        cond: {$eq: ['$$subjects.subject', 'Math']} 
       } 
      } 
     } 
    },{$project: {subjects: { subject:1, score:1}}} 
]); 

Ergebnis:

"result" : [ 
    { 
     "subjects" : [ 
      { 
       "subject" : "Math", 
       "score" : "82" 
      } 
     ] 
    }, 
    { 
     "subjects" : [ 
      { 
       "subject" : "Math", 
       "score" : "52" 
      } 
     ] 
    } 
] 

Ist das, was Sie suchen?

+0

Dank für die Unterstützung, es hat funktioniert. Und der bessere Weg dafür? –

+0

Ich kann in dieser Sekunde nicht an einen denken. Wenn ich eine bessere Idee habe, werde ich die Antwort bearbeiten. Ich bin froh, dass es dir geholfen hat. – rahpuser

Verwandte Themen