是否可以仅查询mongo日期字段的月份的第一天(或最后一天或任何单个?)。
我经常在$ group子句中使用$ date聚合运算符。
基本上我有一个字段已经被汇总(平均)为每个月的每一天。我只希望选择这些天之一(以该值代表整个月)。
以下是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.我目前正在使用$ month数据(并将求和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天的月...别那么在意。
非agg可以,但也不起作用。又名{"date": { "$mod": [ 28, 0 ]} }
要选择每个月的第一天(方法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 })
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句