2017-05-22 1 views
0

集約パイプラインフレームワークを使用しています。これは単純化された例です。私はnameプロパティでドキュメントをグループ化し、city_code値を配列にプッシュします。集約中にグループ化している間は、重複する配列の中で最も頻繁に使用する値を使用します。

これは、初期のコレクション構造である:

{ 
    "name":"foobar", 
    "address":{ 
    "city":"foo", 
    "destination_code":"FOO" 
    } 
}, 
{ 
    "name":"bazfoo", 
    "address":{ 
    "city":"foo", 
    "destination_code":"FOO" 
    } 
}, 
{ 
    "name": "barbaz" 
    "address":{ 
    "city":"foo", 
    "destination_code":"BAR" 
    } 
}, 

私はcityによってグループにそれらをしたいと、最も頻繁に単一の文字列値としてを使用してください。

、これが私のクエリです:

db.cities.aggregate([ 
     { 
      "$group": { 
      "_id": "$address.city", 
      "name": { 
       "$first": "$address.city" 
      }, 
      "city_code": { 
       "$push": "$address.destination_code" 
      } 
      } 
     }, 
     { 
      "$project": { 
      "_id":0, 
      "name":1, 
      "city_code": 1, 
      } 
     }, 
     ]) 

ドク結果から、以下のようになります。私はカウントを持つオブジェクトの配列を取得するには、この更を集約する必要があることを理解し

{ 
    "name" : "Ein Bokek", 
    "city_code" : [ 
     "TLV", 
     "JRS", 
     "JRS", 
     "JRS", 
     "JRS", 
     "JRS", 
     "JRS" 
    ] 
} 

重複します。

{ 
    "name" : "Ein Bokek", 
    "city_code" : [ 
     {"value":"JRS", "count":6}, 
     {"value":"TLV", "count":1}, 

    ] 
} 

、最終的には最初のオブジェクトを取得し、文字列にそれを回す:それはこのように見えるように、カウント(DESC)によって

{ 
    "name" : "Ein Bokek", 
    "city_code" : [ 
     {"value": "TLV", "count":1}, 
     {"value": "JRS", "count":6}, 
    ] 
} 

、その後、ソート:それは次のようになります。

{ 
    "name" : "Ein Bokek", 
    "city_code" : "JRS" 
} 

は、追加の手順を必要としないであろうと、パイプラインの最初のグループに$pushの代わりに使用することができるオペレータにそこに構築されていますか?

+0

集計出力ではなく、ドキュメントの初期構造はどのようになっていますか? – styvane

+0

@ S.M.Styvane質問に初期の文書構造を追加しました。 – Kunok

+0

あなたのパイプラインは次のようになります: '' {{"$ id":{"address": "$ address"、 "dest": "$ address.destination_code"}、 "count":{"$ {"$ limit":1}] ' – styvane

答えて

0

この集約は、問題の説明の手順に従います。基本的には都市名でグループ分けしてから目的地コードを巻き戻し、再びグループ化します。

db.filtered_hotel_data.aggregate([ 
     { 
      "$group": { 
      "_id": "$address.city", 
      "name": { 
       "$first": "$address.city" 
      }, 
      "city_code": { 
       "$push": "$destination_code" 
      }, 
      "hotel_count": { 
       "$sum": 1 
      } 
      } 
     }, 
     { 
      "$project": { 
      "_id":0, 
      "name":1, 
      "city_code":1, 
      "hotel_count":1, 
      } 
     }, 
     { 
      "$unwind": "$city_code" 
     }, 
     { 
      "$group": { 
      "_id": { 
       "name": "$name", 
       "city_code": "$city_code" 
      }, 
      "count": {"$sum": 1}, 
      "hotel_count": { 
       "$first": "$hotel_count" 
      } 
      } 
     }, 
     { 
      "$group": { 
      "_id": "$_id.name", 
      "city_code": { 
       "$push": { 
       "city_code": "$_id.city_code", 
       "count":"$count" 
       } 
      }, 
      "hotel_count": { 
       "$first": "$hotel_count" 
      } 
      } 
     }, 
     { 
      "$unwind": "$city_code" 
     }, 
     { 
      "$sort": { 
      "city_code.count":-1 
      } 
     }, 
     { 
      "$group": { 
      "_id": "$_id", 
      "city_code": { 
       "$push": "$city_code" 
      }, 
      "hotel_count": { 
       "$first": "$hotel_count" 
      } 
      } 
     }, 
     { 
      "$project": { 
      "_id":0, 
      "name":"$_id", 
      "city_code": { 
       "$arrayElemAt": ["$city_code", 0] 
      }, 
      "hotel_count":"$hotel_count", 
      } 
     }, 
     { 
      "$project": { 
      "_id":0, 
      "name":"$name", 
      "city_code": "$city_code.city_code", 
      "hotel_count": "$hotel_count" 
      } 
     } 
     ]) 
関連する問題