2015-10-28 7 views
5

comincio a imparare MongoDB e lavoro con i documenti del genere:Come raggruppare il primo elemento di un array con MongoDB?

{ 
    "_id" : ObjectId("562fac8a4f9ecec40f5b8ff9"), 
    "foo" : { 
     "objectid" : "39", 
     "stuff" : "65" 
    }, 
    "yearpublished" : [ 
     "1979" 
    ], 
    "bar": "1263" 
} 

yearpublished è un array e vorrei gruppo la mia collezione dal primo valore in questo array poi contare la quantità di documenti correlati .

Ho già fatto questa domanda:

db.foobar.aggregate(
    [ 
     { 
     $group : { 
      _id : '$yearpublished', 
      count: { $sum: 1 } 
     } 
     } 
    ] 
) 

e ottenere:

{ 
    "result" : [ 
     { 
      "_id" : [ 
       "1923" 
      ], 
      "count" : 1.0000000000000000 
     }, 
     { 
      "_id" : [ 
       "1864" 
      ], 
      "count" : 1.0000000000000000 
     } 
} 

Ma io sono alla ricerca di questo tipo di risultato (cioè primo elemento solo):

{ 
    "result" : [ 
     { 
      "_id" : "1923, 
      "count" : 1.0000000000000000 
     }, 
     { 
      "_id" : "1864", 
      "count" : 1.0000000000000000 
     } 
} 

Ho provato _id : { $first: '$yearpublished.0' }, o _id : { $first: '$yearpublished[0]' }, senza successo.

Sai che posso raggruppare il primo elemento dell'array anno pubblicato?

risposta

7

Purtroppo in questo momento l'unico modo per farlo è quello di estrarre l'elemento $first dalla matrice dopo l'elaborazione $unwind. Poi, naturalmente, si dovrebbe $group ancora:

db.foobar.aggregate([ 
    { "$unwind": "$yearpublished" }, 
    { "$group": { 
     "_id": "$_id", 
     "yearpublished": { "$first": "$yearpublished" } 
    }}, 
    { "$group": { 
     "_id": "$yearpublished", 
     "count": { "$sum": 1 } 
    }} 
]) 

Questo è l'unico modo corrente per ottenere l'elemento "prima" da un array, decostruendo e utilizzando l'operatore per ottenere l'ingresso.

edizioni future avranno un $arrayElemAt che può fare questo indice all'interno di un singolo stadio:

db.foobar.aggregate([ 
    { "$group": { 
     "_id": { "$arrayElemAt": [ "$yearpublished", 0 ] }, 
     "count": { "$sum": 1 } 
    }} 
]) 

Ma attualmente il quadro di aggregazione non tratta l'utilizzo degli indici "notazione punto", come standard "proiezione" con .find() fa, e non lo farà, quindi le nuove operazioni.

+0

Grazie mille per questa risposta completa. – Alex