2016-11-18 13 views
1

Meine Sammlung hat Daten wie folgt aus:MongoDB, wie man Gruppendokumente

[ 
    { 
    "code": 1, 
    "location": "1 QUEEN STREET", 
    "_id": "1", 
    }, 
    { 
    "code": 1, 
    "location": "2 KING STREET", 
    "_id": "2" 
    }, 
    { 
    "code": 2, 
    "location": "1 QUEEN STREET", 
    "_id": "3" 
    }, 
    { 
    "code": 2, 
    "location": "2 KING STREET", 
    "_id": "4" 
    }, 
    { 
    "code": 2, 
    "location": "2 KING STREET", 
    "_id": "5" 
    } 

] 

für heraus suchen, das würde Gruppendokumente von „Ort“ und eine Reihe von Codes zu jedem Dokument hinzugefügt haben, die die Zählung für jede enthält einzigartiger Code.

Ausgang würde so aussehen:

[ 
    { "location": "1 QUEEN STREET", "codes":["code1":1,"code2":1]}, 
    { "location": "2 KING STREET", "codes":["code1":1,"code2":2]} 
] 

Ich habe versucht, Abfragen wie diese:

aggregate([{ $group : { _id : "$location", codes: { $addToSet: "$code",count: { $sum: 1 } } } }]) 

aggregate([{ $group : { _id : "$location", codes: {$group:{_id:"$_code",count:{$sum :1}}} } }]) 

Vielen Dank für jede Hilfe.

+0

Bitte setzen Loch Dokument hier, nicht nur Array. –

+0

Ihre erwartete Ausgabe ist nicht gut, wie wäre es mit 'Codes' ein Array von Werten anstelle von Filialdokumenten? – styvane

+0

@Styvane ja ein Array von Werten wäre in Ordnung. Ich kann die Frage bearbeiten, um Ihr Feedback zu reflektieren. – HIlo

Antwort

1
aggregate(
[ 
    { $group : { 
      _id : { location: "$location", code: "$code"}, 
      count: { $sum:1 } 
     } 
    }, 
    { $group: { 
      _id: "$_id.location", 
      codes: {$addToSet: {"code":"$_id.code", "count":"$count"}} 
     } 
    }, 
    { $project: { location: "$_id", codes: 1, _id: 0}}, 
] 
) 

Ergebnis:

{ "codes" : [ { "code" : 1, "count" : 1 }, { "code" : 2, "count" : 1 } ], "location" : "1 QUEEN STREET" } 
{ "codes" : [ { "code" : 1, "count" : 1 }, { "code" : 2, "count" : 2 } ], "location" : "2 KING STREET" } 

Hinweis: Youre gewünschte Ausgabe kann nicht achived werden, thhere ist ein Formatfehler auf die Elemente in der Liste, sollten Sie einen dict verwenden, {}.

0

Sie können zwei $group Schritte innerhalb eines Aggregatvorgangs verwenden. Zuerst zählen Sie die Anzahl der Dokumente pro Code und pro Standort. Nächste Sie nur an einer Stelle suchen, und $push die Zählung zusammen mit dem entsprechenden Code in ein Array

[ 
{$group: {_id: {code: '$code', location: '$location'}, count: {$sum: 1}}}, 
{$group: {_id: '$_id.location', codes: {$push: {code: '$_id.code', count: '$count'}}}} 
]