2015-02-10 99 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