2015-02-10 73 views
0

是否可以只查詢mongo日期字段的月份的第一個(或最後一個或任何單個?)日。mongo查詢僅選擇月份的第一個月

我經常使用$date aggregation operators,但在$ group子句中。

基本上我已經爲每月的每一天彙總(平均)的字段。我想僅選擇其中一天(以該值作爲整個月的代表)

以下是2014年1月1日至2015年2月1日的記錄集樣本,其中price作爲每日價格和28day_avg作爲28天的月平均值。

{ "date" : ISODate("2014-01-01T00:00:00Z"), "_id" : ObjectId("533b3697574e2fd08f431cff"), "price": 59.23, "28day_avg": 54.21} 
{ "date" : ISODate("2014-01-02T00:00:00Z"), "_id" : ObjectId("533b3697574e2fd08f431cff"), "price": 58.75, "28day_avg": 54.15} 
... 

{ "date" : ISODate("2015-02-01T00:00:00Z"), "_id" : ObjectId("533b3697574e2fd08f431cff"), "price": 123.50, "28day_avg": 122.25} 

方法1. IM目前使用$月份的數據運行的聚合(和求和price),但一個問題是,即時通訊尋求獲取基礎日期值ISODate(「2015-02-01T00:00:00Z 「)與幾個日期聚合(在第一週,第一月,第一週的循環)附帶的0,1,2值相比較。 mod(28)的日期?

方法2 我想簡單地摘下一個28day_avg作爲該時期的代表記錄。該月的第一將是足夠

期望的輸出是...

_id: ISODate("2015-02-01T00:00:00Z"), value: 122.25, 
_id: ISODate("2015-01-01T00:00:00Z"), value: 120.78, 
_id: ISODate("2014-12-01T00:00:00Z"), value: 118.71, 
... 
_id: ISODate("2014-01-01T00:00:00Z"), value: 53.21, 
當然

,該值將來自方法1變化到2的方法,但是這是罰款。一個是28天的落後,而另一個將佔28,30,31天的月份......不關心那麼多。

非聚集是好的,但也沒有工作。又名{"date": { "$mod": [ 28, 0 ]} }

+0

能否請您提供一個樣本文檔中的問題,你想怎麼日期爲彙總在輸出中。它會爲您的問題提供更多的清晰度。 – BatScream 2015-02-10 05:33:45

+0

我不完全理解方法1的要求。您能否向我們展示有問題的聚合? – wdberkeley 2015-02-10 16:06:14

回答

2

要選擇在第一個月的每個月(方法2),使用下面的集合:

db.test.aggregate([ 
    { "$project" : { "_id" : "$date", "day" : { "$dayOfMonth" : "$date" }, "28day_avg" : 1 } }, 
    { "$match" : { "day" : 1 } } 
]) 

不能使用的索引爲匹配,所以這是效率不高。我建議增加另一場到持有$dayOfMonth值中的每個文件,所以你可以索引,並做一個簡單的查找:

{ 
    "date" : ISODate("2014-01-01T00:00:00Z"), 
    "price" : 59.23, 
    "28day_avg" : 54.21, 
    "dayOfMonth" : 1 
} 

db.test.ensureIndex({ "dayOfMonth" : 1 }) 
db.test.find({ "dayOfMonth" : 1 }, { "_id" : 0, "date" : 1, "28day_avg" : 1 }) 
+0

aha。使用來自一天的月份並應用匹配的0,1,2。甜。而且速度很慢。我正在研究crontabbing一個mongo shell腳本。非常感謝你在nyc的朋友mongo。 – 2015-02-10 17:50:59

+0

上個月的情況如何? – Anmol 2017-10-24 10:48:00