2016-12-05 19 views
2

私はmongodbを初めて使用しており、最大数を持つフィールド名(スペアパーツタイプ)を取得したいと考えています!私のコレクションのサンプル文書は、(元のコレクションは、50件の文書を持っている)私は最高の数とスペアパーツの名前を取得するクエリを書くことができますどのようにmongodbで最大数を持つフィールドの名前を取得する

[ 
    { 
    "Vehicle": { 
     "licensePlateNo": "111A", 
     "vehicletype": "Car", 
     "model": "Nissan Sunny", 
     "VehicleCategory": [ 
     { 
      "name": "Passenger" 
     } 
     ], 
     "SparePart": [ 
     { 
      "sparePartID": 4, 
      "Type": "Wheel", 
      "Price": 10000, 
      "Supplier": [ 
      { 
       "supplierNo": 10, 
       "name": "Saman", 
       "contactNo": 112412634 
      } 
      ] 
     } 
     ], 
     "Employee": [ 
     { 
      "employeeNo": 3, 
      "job": "Painter", 
      "jobCategory": "", 
      "salary": 100000 
     } 
     ] 
    } 
    } 
] 

の下に与えられていますか?

+0

カウントがあるの? –

+0

カウントがありません。車両から選択スペアパーツタイプのようなクエリを実行したいところです。max(count) –

+0

あなたは何を求めているのですか。 –

答えて

1

このタイプのクエリには、集約フレームワークを使用します。特に、あなたは、パイプラインは以下のステージ(順)で構成され、集計操作を実行する必要があるでしょう:

$unwindを - あなたは、あなたがそのようSparePart配列を平らにするために、第1パイプラインのステップとして、これを必要としますパイプラインの下で非正規化されたドキュメントを処理することができます。これがなければ はデータが配列形式になり、前のステージ内のアキュムレータ演算子が単一のドキュメントでカウントを集計するため、目的の結果が得られません。

$group - この手順では、[タイプ]フィールドでグループ化されたドキュメントのカウントが計算されます。アキュムレータ演算子$sumは、各グループのドキュメントの総数を返します。

$sort - あなたは以前$groupパイプラインからの結果を得るため、あなたが最も数の多い上位の文書を入手するようにカウント・フィールドによって文書を注文する必要があります。

$limit - これはあなたに最高のドキュメントを提供します。今

、あなたが希望する結果を得るために、次のパイプラインを実行する必要があります一緒に上記の組み立て:

db.AutoSmart.aggregate([ 
    { "$unwind": "$Vehicle.SparePart" }, 
    { 
     "$group": { 
      "_id": "$Vehicle.SparePart.Type", 
      "count": { "$sum": 1 } 
     } 
    }, 
    { "$sort": { "count": -1 } }, 
    { "$limit": 1 } 
]) 
+0

それが動作していること! –

+0

もし私が最低限のものを手に入れたいのであれば、どうすれば変更できますか? –

+0

最小値を得るには、 '$ sort'パイプラインを '{" $ sort ":{" count ":1}}に変更してください。 – chridam

関連する問題