2017-02-15 17 views
0

私はMongoDBの比較的初心者です。数日後、私はこの問題に苦労しました。ネストされたドキュメントをグループ化する

私は多くの仮説を立てて、類似のニーズに関するすべての可能なドキュメント&の質問を読みましたが、まだ解決策が見つかりませんでした。

私は、次のレコード構造ました:私は取得したい何

{ _id: ObjectId("1234"), 
locationName: "fakeaccount", 
timeZone: "Europe/Rome", 
metricValues: [ 
    { 
     metric: "QUERIES_DIRECT", 
     totalValue: { 
      metricOption: "AGGREGATED_TOTAL", 
      timeDimension: { 
       timeRange: { 
        startTime: "2016-01-01T00:00:00Z", 
        endTime: "2016-01-03T00:00:00Z" 
       } 
      }, 
      value: "0" 
     }, 
     dimensionalValues: [ 
      { 
       metricOption: "AGGREGATED_DAILY", 
       timeDimension: { 
        timeRange: { 
         startTime: "2016-01-01T23:00:00Z" 
        } 
       }, 
       value: "0" 
      }, 
      { 
       metricOption: "AGGREGATED_DAILY", 
       timeDimension: { 
        timeRange: { 
         startTime: "2016-01-02T23:00:00Z" 
        } 
       }, 
       value: "1" 
      } 
     ] 
    }, 
    { 
     metric: "QUERIES_INDIRECT", 
     totalValue: { 
      metricOption: "AGGREGATED_TOTAL", 
      timeDimension: { 
       timeRange: { 
        startTime: "2016-01-01T00:00:00Z", 
        endTime: "2016-01-03T00:00:00Z" 
       } 
      }, 
      value: "0" 
     }, 
     dimensionalValues: [ 
      { 
       metricOption: "AGGREGATED_DAILY", 
       timeDimension: { 
        timeRange: { 
         startTime: "2016-01-01T23:00:00Z" 
        } 
       }, 
       value: "2" 
      }, 
      { 
       metricOption: "AGGREGATED_DAILY", 
       timeDimension: { 
        timeRange: { 
         startTime: "2016-01-02T23:00:00Z" 
        } 
       }, 
       value: "1" 
      } 
     ] 
    } 
    } 
] } 

はフィールドmetricValues.dimensionalValues.valuemetricValues.metricで、その後metricValues.dimensionalValues.timeDimension.timeRange.startTimeによってグループ化され、出力ドキュメントです。

期待JSON出力:

[{ 
    "startTime": "2016-01-01T00:00:00Z", 
    "metrics": { 
     "QUERIES_DIRECT": { 
      "value": 0 
     }, 
     "QUERIES_INDIRECT": { 
      "value": 1 
     } 
    } 
}, 
{ 
    "startTime": "2016-01-02T00:00:00Z", 
    "metrics": { 
     "QUERIES_DIRECT": { 
      "value": 2 
     }, 
     "QUERIES_INDIRECT": { 
      "value": 1 
     } 
    } 
}] 

答えて

0

あなたは、以下のような何かを試すことができます。

$unwindグループ化のために構造体を平坦化するために2回。

$groupstartTimeであり、各グループについてmetricおよびvalueを集める。

db.collection.aggregate(
    {$unwind:"$metricValues"}, 
    {$unwind:"$metricValues.dimensionalValues"}, 
    {$group: { 
     _id: "$metricValues.dimensionalValues.timeDimension.timeRange.startTime", 
     metrics: { 
      $addToSet: {metric:"$metricValues.metric",value:"$metricValues.dimensionalValues.value"} 
     } 
    } 
}); 
関連する問題