1

聚合框架我有對象的從我的MongoDB查詢以下陣列基於時間得到一些統計數據:集團通過時間戳和MongoDB中

[ 
    { 
     _id: { year: 2014, dayOfYear: 128, hour: 9 }, 
     count: 2, 
     avg: 0.12455, 
     min: 0.1245, 
     max: 0.1246, 
     gv: 7.98954654895666, 
     bv: 0.9950000000000001 
    }, 
    { 
     _id: { year: 2014, dayOfYear: 134, hour: 14 }, 
     count: 8, 
     avg: 0.12217854, 
     min: 0.1212, 
     max: 0.12345678, 
     gv: 25.869999999999997, 
     bv: 3.1652450614477337 
    }, 
    { 
     _id: { year: 2014, dayOfYear:126, hour: 19 }, 
     count: 3, 
     avg: 0.11234099999999998, 
     min: 0.112341, 
     max: 0.112341, 
     gv: 29.849999999999998, 
     bv: 3.3533788500000004 
    } 
] 

我想將_id對象主要轉化爲Unix時間戳和moment.js我只是不能找到正確的下劃線函數來遍歷對象,獲取ID數據並再次創建一個數組。 。

在這個過程中我也只是做片刻()年( '2014')格式( 'Z')

結果想:

{ 
    unixtime: 1400599394, 
    count: 3, 
    avg: 0.11234099999999998, 
    min: 0.112341, 
    max: 0.112341, 
    gv: 29.849999999999998, 
    bv: 3.3533788500000004 
} 
+0

這實際上是從聚合框架輸出嗎?如果是的話,你的真正目的是什麼?你是否想每天在「小時」內進行分組? –

回答

4

我知道你是問如何用承諾來做到這一點,但我只是在這裏根據_id下的字段命名,這實際上是從aggregation framework輸出的,因此有另一種方法來做到這一點。

的,你似乎已經使用date operators非常適合他們的目的,但你似乎想Unix時間戳作爲輸出,然後做合乎邏輯的做法是保持在Unix時間戳格式字段,正好與組邊界你需要。

這似乎是分組「每小時」每一天之內,所以我們申請的日期數學,以改變該時間戳值。因此,而不是使用日期運算分手在你$group管道密鑰的日期,而是執行此操作:

{ "$group": { 
    "_id": { 
     "$subtract": [ 
      { "$subtract": [ "$created", new Date("1970-01-01") ] }, 
      { "$mod": [ 
       { "$subtract": [ "$created", new Date("1970-01-01") ] }, 
       1000*60*60 
      ]} 
     ] 
    } 
}} 

當然包括所有你有其他事情在你的聚集管道(未在這個問題提供),但結果是實際時期時間戳值將從原始日期字段中截斷爲一天中的小時,該日期字段被命名爲「已創建」。

只是爲了打破這個部分考慮這個日期對象:

var date = new Date() 
date.valueOf() 
1400639001169 

所以你看到從Date對象中提取的時代時間戳表示。在數學方面,經由.valueOf()方法檢索該值是完全一樣:

date - new Date("1970-01-01") 
1400639001169 

哪個提供了自「1970-01-01」經過的秒(或毫秒在這種情況下),其正是時代的到來。

date % (1000*60*60) 
1401169 

因此,與1000毫秒中的第二,在一分鐘60秒,60分鐘一小時我們:進一步這一點,我們可以得到毫秒在1小時內通過獲得模量經過如此日期的一部分獲得這個結果。所有這一切,現在剩下的就是減去從原來的日期值值:

date - date % (1000*60*60) 
1400637600000 

現在該值是在白天小時的分組以及作爲你想要的理想的結果的邊界和合適的你的輸出。僅供參考,這裏的字符串格式化的初始和轉換時間戳值:

 
    Initial: Wed, 21 May 2014 02:23:21 GMT 
    Converted: Wed, 21 May 2014 02:00:00 GMT 

所以基本上你正在做同樣的事情,你正在使用的date operators進行分組,但實際上得到你想要的輸出格式而不需要額外的轉換。

只是一個很酷的把戲,如果我說得對,你是如何來到這裏應該是對你有用,如果沒有,那麼至少應該是其他人誰也有可能出現這樣認爲的抵達這裏有用的。

+0

你先生,是一個真正的!是的,我已經將它聚合在一起,這非常簡單。我找不到一個體面的方式來製作「小時年」等。回到時間戳。虐待檢查答案,它的作品完美。看起來更好,然後使用所有JavaScript解決方法。謝謝尼爾。 – xan4fun

+0

@xanatas沒問題,就像我說的,看起來就像你在做什麼。 Pitty你的問題題爲「JavaScript解決方案」。介意我在那裏做一些編輯? –