2015-01-19 12 views
6

Dire che ho questo:chiavi dinamiche di valori in MongoDB

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

ho bisogno di essere in grado di trovare la differenza nel campo avgInstructor 2012-13. Stavo pensando che potrei trasformare i tasti in qualche modo usando uno $project che renderebbe l'anno la chiave e il valore di avgInstructor. Quindi sarebbe simile a questo:

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

} 

È possibile? Tieni presente che il mio obiettivo principale è quello di essere in grado di eseguire una sottrazione come questo pseudocodice: years['2013'].avgInstructor - years['2013'].avgInstructor. Quindi se vedi un modo più semplice, sarebbe grandioso. Non sono sicuro del modo migliore per farlo nel contesto di una pipeline di aggregazione. Qualcuno può aiutare?

+1

Non smette mai di stupirmi perché qualcuno potrebbe pensare che questa sia una buona cosa rispetto a come è già memorizzata. Inoltre, indipendentemente da ciò che si vuole fare qui, è probabile che sarà più efficiente nel codice se non si sta effettivamente aggregando nulla tra i documenti. –

+0

Hai visto il mio commento sull'offrire una soluzione migliore se ne vedi una? Il tuo commento non aiuta molto. Alcune note: 1) Questo è un piccolo set di dati, quindi le prestazioni non sono della massima priorità. 2) Mi è stato chiesto di completare questo utilizzando * solo * una query Mongo. È per lo più un'esperienza di apprendimento, e preferirei molto di più codificarlo (è un problema relativamente semplice, quindi). – ianks

+0

Beh, penso che lo faccia e almeno una persona è d'accordo. Sembra che la soluzione migliore sia lasciarla così com'è. Cosa c'è di sbagliato con appena sottrarre: 'years [0] .avgInstructor - years [1] .avgInstructor' o con' indexOf ("2013)' dopo un 'map()' per il valore del campo per ottenere l'indice dell'elemento o qualsiasi altra lingua Notazioni equivoche non si aggregano i documenti, quindi sembra un lavoro non necessario. –

risposta

0

Una possibile risposta ...

  1. Rilassati primo progetto
  2. per renderlo un po 'più facile da gestire
  3. Ordina su _id e quindi su base annua gruppo
  4. da _id di pick-up il primo e l'ultimo valore
  5. proiezione finale per ottenere valore sottratto

    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" ] } } } 
    
    ]) 
    
Problemi correlati