2017-08-29 39 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 ] 
    } 
    ] 
} 

我想組基於小時的TS字段中的數據,並得到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

你不會得到譜寫第一像這樣的聚合管道中的數組元素。你想$arrayElemAt其通過索引返回數組值:

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

如果您的MongoDB不支持$arrayElemAt(早於3.2),那麼你可以改用$first在附加$group上只是文檔鍵,你以前做過「積累」爲需要的分組鍵:

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" } 
    }} 
]) 

在現代版本中,你可以「雙桶」的$sum兩者加起來數組元素以及充當蓄能器,如果你想「和」 所有 eleme數組的NTS:與舊版本(3.2之前)

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

,你會「雙規」 $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。不要只留下評論說謝謝,而是通過[Accepting the Answer](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)指出正確答案是一個明確的跡象。 –

0

你需要使用$第一家運營商爲代替的$總結

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

,這將給你喜歡輸出{ 「_id」:28, 「尤卡斯特」:676.297664,676.297664]}

如果您希望在下一個$ project或$ addFields階段使用{「_id」:28,「ucast」:676.297664}輸出使用$ arrayElemAt