2016-06-30 1 views
0

で私は$使用して複数のフィールドをほどくています、そのクエリでそのクエリに1つのクエリを作成しました。クエリ応答は正常ですが、私のシニアはこれが間違ったクエリであると私に示唆していますクエリ応答は適切な形式ではなく、r_y_b_phasetimestampタイムスタンプの昇順ではないためです。次のように私は、クエリを与えられた:コレクションの

db.energy.aggregate([ 
    { 
     $project: { EventTS: 1, RPhaseVoltage: 1, YPhaseVoltage:1, BPhaseVoltage:1} 
    }, 
    { 
     $unwind: { 
      path: "$RPhaseVoltage", 
      includeArrayIndex: "arrayIndex", 
      preserveNullAndEmptyArrays: true 
     } 
    }, 
    { 
     $unwind: { 
      path: "$YPhaseVoltage", 
      includeArrayIndex: "arrayIndex", 
      preserveNullAndEmptyArrays: true 
     } 
    }, 
    { 
     $unwind: { 
      path: "$BPhaseVoltage", 
      includeArrayIndex: "arrayIndex", 
      preserveNullAndEmptyArrays: true 
     } 
    }, 
    { 
     $match: { 
      $and: [ 
       {RPhaseVoltage: {$ne: null}}, 
       {YPhaseVoltage: {$ne: null}}, 
       {BPhaseVoltage: {$ne: null}}, 
      ] 
     } 
    }, 
    { 
     $project: { 
      _id:0, 
      EventTS:1, 
      RPhaseVoltage: 1, 
      YPhaseVoltage: 1, 
      BPhaseVoltage:1, 
      r_y_b_phasetimestamp: { 
       "$add": [ 
        { "$subtract": ["$EventTS", new Date("1970-01-01")]}, 
        { "$multiply": [ 60000, "$arrayIndex" ] } 
       ] 
      } 
     } 
    }, 
    { 
     $project: { 
     "rvoltage_data":["$r_y_b_phasetimestamp", "$RPhaseVoltage"], 
     "yvoltage_data":["$r_y_b_phasetimestamp", "$YPhaseVoltage"], 
     "bvoltage_data":["$r_y_b_phasetimestamp", "$BPhaseVoltage"] 
     } 
    }, 
    { 
     $sort:{ 
      r_y_b_phasetimestamp:-1 
     } 
    } 
]); 

マイサンプル

{ 
    "_id" : ObjectId("57742e0f8d8b8fdf278b45d1"), 
    "EventTS" : ISODate("2016-06-24T12:30:00.000+0000"), 
    "RPhaseVoltage" : [ 
     null, 
     231.81, 
     231.81, 
     null, 
     231.42 
    ], 
    "YPhaseVoltage" : [ 
     229.95, 
     229.95, 
     null, 
     null, 
     231.32 
    ], 
    "BPhaseVoltage" : [ 
     null, 
     231.44, 
     231.44, 
     null, 
     null 
    ] 
} 

マイグラフ出力リンクがGraph Plotting Linkで次のように。この質問はグラフのプロットに使用しています。私のクエリが間違っていると、グラフがこの

+0

となります。集計の結果はどうなりますか? 1 'の代わりに 'r_y_b_phasetimestampの:$のr_y_b_phasetimestamp' –

答えて

0

likwプロットされた理由を$project 2回を使用している私を提案してください。 $projectを使用すると、投影された値だけがパイプラインの次の部分に渡されます。ソートを使用する前に、r_y_b_phasetimestampが投影されていません。したがって、ソートの際にr_y_b_phasetimestampは未定義となり、結果はソートされません。 "bvoltage_data":["$r_y_b_phasetimestamp", "$BPhaseVoltage"]r_y_b_phasetimestamp:"$r_y_b_phasetimestamp"を渡してみてください。最終的なコードは

db.energy.aggregate([ 
{ 
    $project: { EventTS: 1, RPhaseVoltage: 1, YPhaseVoltage:1, BPhaseVoltage:1} 
}, 
{ 
    $unwind: { 
     path: "$RPhaseVoltage", 
     includeArrayIndex: "arrayIndex", 
     preserveNullAndEmptyArrays: true 
    } 
}, 
{ 
    $unwind: { 
     path: "$YPhaseVoltage", 
     includeArrayIndex: "arrayIndex", 
     preserveNullAndEmptyArrays: true 
    } 
}, 
{ 
    $unwind: { 
     path: "$BPhaseVoltage", 
     includeArrayIndex: "arrayIndex", 
     preserveNullAndEmptyArrays: true 
    } 
}, 
{ 
    $match: { 
     $and: [ 
      {RPhaseVoltage: {$ne: null}}, 
      {YPhaseVoltage: {$ne: null}}, 
      {BPhaseVoltage: {$ne: null}}, 
     ] 
    } 
}, 
{ 
    $project: { 
     _id:0, 
     EventTS:1, 
     RPhaseVoltage: 1, 
     YPhaseVoltage: 1, 
     BPhaseVoltage:1, 
     r_y_b_phasetimestamp: { 
      "$add": [ 
       { "$subtract": ["$EventTS", new Date("1970-01-01")]}, 
       { "$multiply": [ 60000, "$arrayIndex" ] } 
      ] 
     } 
    } 
}, 
{ 
    $project: { 
    "rvoltage_data":["$r_y_b_phasetimestamp", "$RPhaseVoltage"], 
    "yvoltage_data":["$r_y_b_phasetimestamp", "$YPhaseVoltage"], 
    "bvoltage_data":["$r_y_b_phasetimestamp", "$BPhaseVoltage"], 
    r_y_b_phasetimestamp:"$r_y_b_phasetimestamp" 
    } 
}, 
{ 
    $sort:{ 
     r_y_b_phasetimestamp:-1 
    } 
} 
]); 
+0

示すエラー –

+0

あなたは' r_y_b_phasetimestampを試すことができます "$のr_y_b_phasetimestampはdefindedされていませんか"? – raj

+0

これは複数回$プロジェクトを使用してとは何の関係もありません - 同じパイプラインで複数のプロジェクト段を有する全く問題はありません。 –

関連する問題