2017-02-15 60 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.dimensionalValues.timeDimension.timeRange.startTime分組,然後由metricValues.metric輸出文檔。

預期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幾次來壓扁分組的結構。

$groupstartTime上並且收集每個組的metricvalue

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