2017-04-08 213 views
2

我有印度的州,地区和村庄的文件集合。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" 
} 

我要通过国家,地区和村民小组就以这样的方式,我的结果在下面的格式

[ 
    { 
    "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" 
      } 
     ] 
     } 
    ] 
    } 
] 

我试过,但没有找到一种方式来获得这样的聚集。

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"}}, }) 

我在elasticsearch中制定了这样的聚合。

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" 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

我怎样才能得到这个MongoDB?因为我不想仅使用elasticsearch来做这件事。

+0

尝试更新它。 – Hussain

回答

2

您可以尝试下面的聚合。下面的查询$groupstatedistrict上积累villages后面$groupstate积累district和以前收集的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"}} 
    } 
}])