2016-05-24 3 views
1

私はしばらくの間困っていた、本当に簡単な質問があります。私は、以下のいずれかに設定し、次のデータを投影し、クエリを作成したいプロジェクトデータを新しいオブジェクトに設定しました

{ 
    "_id" : ObjectId("5710ed8129c7f31530a537bc"), 
    "Measurements" : [ 
     { 
      "_t" : "Measurement", 
      "_time" : ISODate("2016-04-14T12:31:52.584Z"), 
      "Measurement1" : 1 
      "Measurement2" : 2 
      "Measurement3" : 3 
     }, 
     { 
      "_t" : "DataType", 
      "_time" : ISODate("2016-04-14T12:31:52.584Z"), 
      "Measurement1" : 4 
      "Measurement2" : 5 
      "Measurement3" : 6 
     }, 
     { 
      "_t" : "DataType", 
      "_time" : ISODate("2016-04-14T12:31:52.584Z"), 
      "Measurement1" : 7 
      "Measurement2" : 8 
      "Measurement3" : 9 
     } ] 
}, 
{ 
    "_id" : ObjectId("5710ed8129c7f31530a537cc"), 
    "Measurements" : [ 
     { 
      "_t" : "Measurement", 
      "_time" : ISODate("2016-04-14T12:31:52.584Z"), 
      "Measurement1" : 0 
.... 

:私は、これらのそれぞれは、以下のような時間と、複数の値が含まれていMeasurementsの配列を含むオブジェクトのリストを持っています。たとえば、Measurement1を照会し、mongo集約フレームワークを介してMeasurement1(下記参照)の時間と値を含むオブジェクトの配列を作成します。

{ "Measurement": [ 
    { 
     "Time": ISODate("2016-04-14T12:31:52.584Z"), 
     "Value": 1 
    } 
    { 
     "Time": ISODate("2016-04-14T12:31:52.584Z"), 
     "Value": 4 
    } 
    { 
     "Time": ISODate("2016-04-14T12:31:52.584Z"), 
     "Value": 7 
    } 
]} 

かなり標準的な操作のようです。だから、皆さんはこれについていくつか光を当てることができますように願っています。

答えて

3

あなたはまず、各ドキュメントのためMeasurements配列を巻き戻し、その後、あなたが必要なフィールドを投影して、それらを一緒に戻ってグループ化することによって、これを行うことができます。

db.test.aggregate([ 
    // Duplicate each doc, once per Measurements array element 
    {$unwind: '$Measurements'}, 
    // Include and rename the desired fields 
    {$project: { 
     'Measurements.Time': '$Measurements._time', 
     'Measurements.Value': '$Measurements.Measurement1'  
    }}, 
    // Group the docs back together to reassemble the Measurements array field 
    {$group: { 
     _id: '$_id', 
     Measurements: {$push: '$Measurements'} 
    }} 
]) 
関連する問題