2015-01-19 6 views
6

Sagen, ich habe dies:Dynamische Schlüssel von Werten in MongoDB

{ 
     "_id" : "ENVD", 
     "years" : [ 
       { 
         "year" : "2013", 
         "avgInstructor" : 5.144999999999998 
       }, 
       { 
         "year" : "2012", 
         "avgInstructor" : 5.194436090225564 
       } 
     ] 
} 

Ich brauche 2012-13 den Unterschied in dem avgInstructor Feld finden zu können. Ich dachte, dass ich die Schlüssel irgendwie umwandeln könnte, indem ich eine benutze, die das Jahr zum Schlüssel machen würde, und die avgInstructor Bewertung wäre der Wert. So würde es so aussehen:

{ 
     "_id" : "ENVD", 
     "years" : { 
         "2013" : 5.144999999999998, 
         "2012" : 5.194436090225564 
     } 

} 

Ist das möglich? Denken Sie daran, mein Hauptziel ist es, eine Subtraktion wie diesen Pseudocode ausführen zu können: years['2013'].avgInstructor - years['2013'].avgInstructor. Wenn Sie also einen einfacheren Weg sehen, wäre das auch großartig. Ich bin nicht sicher über den besten Weg, dies im Rahmen einer Aggregationspipeline zu tun. Kann jemand helfen?

+1

Nie aufhört mich zu überraschen, warum jemand würde denken, dass dies eine gute Sache ist, im Vergleich zu, wie es bereits gespeichert ist. Unabhängig davon, was Sie hier tun möchten, wird es wahrscheinlich effizienter im Code sein, wenn Sie nichts zwischen Dokumenten aggregieren. –

+0

Haben Sie meinen Kommentar zum Angebot einer besseren Lösung gelesen, wenn Sie einen sehen? Dein Kommentar hilft nicht sehr. Ein paar Anmerkungen: 1) Dies ist ein kleiner Datensatz, daher hat die Leistung nicht die höchste Priorität. 2) Ich wurde gebeten, dies mit * nur * einer Mongo-Abfrage zu vervollständigen. Es ist meistens eine Lernerfahrung, und ich würde es lieber vorziehen, dies auszuarbeiten (es ist dann ein relativ einfaches Problem). – ianks

+0

Nun, ich denke, es stimmt und mindestens eine Person stimmt zu. Es scheint die beste Lösung zu sein, es so zu lassen, wie es ist. Was ist falsch mit nur Subtrahieren: 'Jahre [0] .avgInstructor - Jahre [1] .avgInstructor 'oder mit' indexOf ("2013)' nach einem 'map()' für den Feldwert, um den Elementindex oder welche Sprache zu bekommen Äquivalenzbezeichnungen: Sie aggregieren keine Dokumente, daher erscheint es als unnötige Arbeit. –

Antwort

0

Eine mögliche Antwort ...

  1. Entspannen erste
  2. Projekt es ein wenig leichter zu machen
  3. Sortieren auf _id zu handhaben und dann auf Jahr
  4. Gruppe von _id ersten Pickup und der letzte Wert
  5. endgültige Projektion erhalten Subtraktionswert

    db.coll.aggregate ([ 
    
         { "$unwind" : "$years" } , 
    
         { $project : { "year" : "$years.year", "avgInstructor" : "$years.avgInstructor" } }, 
    
         { $sort : { "_id" : 1, "year" : 1 } }, 
    
         { $group : { "_id" : "$_id", "val_min" : { $first : "$avgInstructor" }, "val_max" : { $last : "$avgInstructor" } } }, 
    
         { $project : { "diff" : { $subtract : [ "$val_min", "$val_max" ] } } } 
    
    ]) 
    
Verwandte Themen