2015-10-28 17 views
5

Ich beginne MongoDB zu lernen, und ich arbeite mit Dokumenten wie folgt aus:Wie gruppiere ich das erste Element eines Arrays mit MongoDB?

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

yearpublished ein Array ist, und ich würde dann die Menge von Dokumenten zählen in diesem Array durch den ersten Wert zu einer Gruppe meiner Sammlung gerne verwandten .

Ich habe bereits diese Anfrage:

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

und erhalten:

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

Aber ich bin auf der Suche für diese Art von Ergebnis (dh das erste Element nur):

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

Ich versuchte _id : { $first: '$yearpublished.0' }, oder _id : { $first: '$yearpublished[0]' }, ohne Erfolg.

Kennen Sie kann ich Gruppe durch das erste Element des Arrays yearpublished?

Antwort

7

leider im Augenblick der einzige Weg, dies zu tun, ist das $first Element aus dem Array zu extrahieren nach $unwind Verarbeitung. Dann natürlich würden Sie wieder zu $group haben:

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

Das ist der einzige aktuelle Weg, um das „erste“ Element aus einem Array zu erhalten, indem sie sie zu dekonstruieren und mit dem Operator den Eintrag zu erhalten.

Zukünftige Versionen werden $arrayElemAt haben, welche diese in einer einzigen Stufe durch den Index tun kann:

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

aber derzeit die Aggregation Rahmen mit „Punktnotation“ Index-Nutzung wie Standard „Projektion“ nicht mit .find() beschäftigen tut, und wird nicht, daher die neuen Operationen.

+0

Vielen Dank für diese vollständige Antwort. – Alex

Verwandte Themen