2017-08-29 4 views
1

後、私は系列データにMongoDBに

{ 
    "_id" : ObjectId("59a46062e1aeb958a712490e"), 
    "channelName" : "ABC", 
    "rtData" : [ 
    { 
     "ts" : ISODate("2017-08-28T18:26:42.837Z"), 
     "data" : [ 676.297664, 676.297664 ] 
    }, 
    { 
     "ts" : ISODate("2017-08-28T18:27:42.837Z"), 
     "data" : [ 724.297664, 676.297664 ] 
    }, 
    { 
     "ts" : ISODate("2017-08-28T18:29:42.837Z"), 
     "data" : [ 878.297, 676.297 ] 
    } 
    ] 
} 

を保存し、次の時間を持っている私が欲しいデータをグループ化すると、そのためのrtDataの最初の要素を取得時間。ここ は、私が

db.channels.aggregate([ {$match: {"channelName": "ABC"} }, { $unwind : "$rtData" }, { $group : {_id: { $hour: "$rtData.ts" }, ucast: { $sum: $rtData.data[0]} } 

を試してみました。しかし、上記のコードは、私に次のような出力を与えるものである

{ "_id" : 28, "ucast" : 0 } 

私は実際にあなたが最初に取得記譜していない

{ "_id" : 28, "ucast" : 676.297664 } 

答えて

0

で欲しいですそのような集約パイプラインの配列の要素。あなたのMongoDBは、(3.2より前に)$arrayElemAtをサポートしていない場合は、あなたの代わりにあなたの前に行って、単に文書キーに追加$group$firstを使用することができ、

db.channels.aggregate([ 
    { $match: {"channelName": "ABC"} }, 
    { $unwind : "$rtData" }, 
    { $group : { 
    _id: { $hour: "$rtData.ts" }, 
    ucast: { $sum: { $arrayElemAt: [ "$rtData.data", 0 ] } } 
    }} 
]) 

:あなたは、インデックスによって配列値を返します$arrayElemAtをしたいです目的のキーグループ化するために、「蓄積」:

あなたは「合計」 すべてしたい場合、あなたは「ダブルバレル」の両方へ $sumがアキュムレータとして配列要素だけでなく、行動を追加することができ、現代のバージョンでは
db.channels.aggregate([ 
    { $match: {"channelName": "ABC"} }, 
    { $unwind : "$rtData" }, 
    { $group: { 
    _id: { _id: "$_id", ts: "$rtData.ts" }, 
    data: { $first: "$rtData.data" } 
    }}, 
    { $group : { 
    _id: { $hour: "$_id.ts" }, 
    ucast: { $sum: "$data" } 
    }} 
]) 

をエレメ配列のNTS:

db.channels.aggregate([ 
    { $match: {"channelName": "ABC"} }, 
    { $unwind : "$rtData" }, 
    { $group : { 
    _id: { $hour: "$rtData.ts" }, 
    ucast: { $sum: { $sum: "$rtData.data" } } 
    }} 
]) 

そして古いバージョン(3.2より前に)あなたが代わりに各配列のパスのための「ダブル」$unwindだろうと:あなたが代わりにそのための$最初の演算子を使用する必要が

db.channels.aggregate([ 
    { $match: {"channelName": "ABC"} }, 
    { $unwind : "$rtData" }, 
    { $unwind : "$rtData.data" }, 
    { $group : { 
    _id: { $hour: "$rtData.ts" }, 
    ucast: { $sum: "$rtData.data" } 
    }} 
]) 
+0

ありがとうございます。 – Neeraj

+0

@NeerajようこそStackOverflowへ。感謝の言葉を残すだけではなく、[回答を受け入れる](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)で正解を示してください。明確な表示です。 –

0

$和の

{ "_id":28、 "ウカスト":[676.297664、676.297664]}のように、あなたの出力が得られます
db.channels.aggregate([ {$match: {"channelName": "ABC"} }, { $unwind : "$rtData" }, { $group : {_id: { $hour: "$rtData.ts" }, ucast: { $first: $rtData.data} } 

次の$ projectまたは$ addFieldsステージで{"_id":28、 "ucast":676.297664}のような出力をしたい場合は$ arrayElemAtを使用してください。

関連する問題