2016-04-28 40 views
1

我需要生成每月和每年的報告。那麼,如何獲得具有「創造」領域的明智和明智的文檔。如何獲得具有'createdat'字段的明智和明智的文檔

+0

的輸出是什麼格式,你期待? –

+0

在名爲「orders」的集合中,我有幾個包含6-7個字段的文檔。這些文件中的一個字段是「createdAt」。現在通過給予年份,我應該得到當年的所有文件。以同樣的方式,如果我按月查詢,我應該得到那一年特定月份的所有文件。 - @DeendayalGarg –

回答

1

我建議你使用aggregation framework 你需要項目的所有createdAt領域進入yearmonth領域如下:

db.collection.aggregate([{ 
    $project: { 
     year: { 
      $year: "$createdat" 
     }, 
     month: { 
      $month: "$createdat" 
     }, 
     log_field: 1, 
     other_field: 1, 
    } 
}, { 
    $match: { 
     "year": 2016 
    } 
}]); 

更多關於$project

0

細節我知道你可能無法改變你的數據結構,但如果你這樣做,這可能對你有用......

我做得很好在我們的項目中有很多這樣的事情,並且總是發現最好的(如最簡單和最快的)方式是事先將這種信息分開存儲。例如,我存儲完整的日期時間字段(與您一樣),但,然後將YYYYMM值存儲在其自己的字段以及Day中。這些值/格式可能會因數據類型而有所不同,但我已經取得了非常好的成功。

(對於背景下,我存儲的財務數據計算,隨地高達數百萬條記錄,每月,每個客戶.....不是聚合框架已經很好地管理)
的BSON

的一個小樣本
.... 
"cd" : ISODate("2016-02-29T22:59:59.999Z"), 
"cdym" : "201602", 
"cdd" : "29", 
.... 
-1

我得到了答案,這就是答案。

db.mycollection.aggregate([ 
{ "$redact": { 
    "$cond": [ 
     { "$and": [ 
      { "$eq": [ { "$year": "$date" }, 2016 ] }, 
      { "$eq": [ { "$month": "$date" }, 5 ] } 
     ] }, 
     "$$KEEP", 
     "$$PRUNE" 
    ] } 
} 

])