2

Ich habe eine Mongo-Sammlung von Dokumenten mit Staaten, Distrikt und Dörfern in Indien.Aggregation auf Aggregation in Mongodb

{ 
    "_id" : ObjectId("58db5a5f8f7b5013ad477564"), 
    "district" : "Chittor", 
    "state" : "Andhra Pradesh", 
    "village" : "Chittoor" 
}, 
{ 
    "_id" : ObjectId("58db5a628f7b5013ad477566"), 
    "district" : "Dibrugarh", 
    "state" : "Assam", 
    "village" : "Dibrugarh" 
}, 
{ 
    "_id" : ObjectId("58db5a628f7b5013ad47756d"), 
    "district" : "Lakhimpur", 
    "state" : "Assam", 
    "village" : "Kadam" 
}, 
{ 
    "_id" : ObjectId("58db5a628f7b5013ad47756e"), 
    "district" : "Sonitpur", 
    "state" : "Assam", 
    "village" : "Helem" 
}, 
{ 
    "_id" : ObjectId("58db5a628f7b5013ad477572"), 
    "district" : "Gandhinagar", 
    "state" : "Gujarat", 
    "village" : "Mansa" 
}, 
{ 
    "_id" : ObjectId("58db5a628f7b5013ad477573"), 
    "district" : "Gandhinagar", 
    "state" : "Gujarat", 
    "village" : "Kalol" 
}, 
{ 
    "_id" : ObjectId("58db5a628f7b5013ad477574"), 
    "district" : "Ahmadabad", 
    "state" : "Gujarat", 
    "village" : "Barwala" 
} 

ich gruppieren wollen es durch den Staat, Landkreis und das Dorf in einer Weise, dass ich das Ergebnis im folgenden Format

[ 
    { 
    "state": "Gujarat", 
    "districts": [ 
     { 
     "district": "Gandhinagar", 
     "villages": [ 
      { 
      "village": "Mansa" 
      }, 
      { 
      "village": "Kalol" 
      } 
     ] 
     }, 
     { 
     "district": "Ahmadabad", 
     "villages": [ 
      { 
      "village": "Barwala" 
      } 
     ] 
     } 
    ] 
    }, 
    { 
    "state": "Assam", 
    "districts": [ 
     { 
     "district": "Sonitpur", 
     "villages": [ 
      { 
      "village": "Helem" 
      } 
     ] 
     }, 
     { 
     "district": "Lakhimpur", 
     "villages": [ 
      { 
      "village": "Kadam" 
      } 
     ] 
     }, 
     { 
     "district": "Dibrugarh", 
     "villages": [ 
      { 
      "village": "Dibrugarh" 
      } 
     ] 
     } 
    ] 
    }, 
    { 
    "state": "Andhra Pradesh", 
    "districts": [ 
     { 
     "district": "Chittor", 
     "villages": [ 
      { 
      "village": "Chittor" 
      } 
     ] 
     } 
    ] 
    } 
] 

Ich habe versucht, aber nicht einen Weg, um eine solche Aggregation finden.

1) db.historical_prices.aggregate({$group: {_id: {"state": "$state"}}}, {$group: {_id: {"commodity": "$commodity"}}}) 

2) db.places.aggregate() 
     .match(qb.where("enabled").eq(false)) 
     .group({ _id: {"state": "$state", "district": "$district"}, "districts": {$push: {district: "$district"}}, }) 

Ich arbeitete diese Art der Aggregation in elasticsearch aus.

GET /places/_search 
{ 
    "query": { "match_all": {} }, 
    "size": 0, 
    "aggs": { 
    "group_by_state": { 
     "terms": { 
     "field": "state.keyword" 
     }, 
     "aggs": { 
     "group_by_district": { 
      "terms": { 
      "field": "district.keyword" 
      }, 
      "aggs": { 
      "group_by_village": { 
       "terms": { 
       "field": "village.keyword" 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

Wie kann ich das in MongoDB bekommen? Weil ich nicht elasticsearch nur dafür verwenden möchte.

+0

Aktualisierung mit Versuchen. – Hussain

Antwort

2

Sie können unter Aggregation versuchen. Die folgende Abfrage $group auf state und district akkumulieren villages gefolgt von $group auf state, um district akkumulieren und zuvor gesammelt villages.

db.collection.aggregate([{ 
    $group: { 
     _id: {state:"$state", district:"$district"}, 
     "villages":{$addToSet:{village:"$village"}} 
    } 
},{ 
    $group: { 
     _id: {state:"$_id.state"}, 
     "districts":{$push:{villages:"$villages", district:"$_id.district"}} 
    } 
}])