【发布时间】:2025-12-30 08:45:11
【问题描述】:
是否可以只查询 mongo 日期字段的月份的第一天(或最后一个或任何一个?)。
我经常在 $group 子句中使用$date aggregation operators。
基本上,我有一个已经为每个月的每一天聚合(平均)的字段。我只想选择其中的一天(以代表整个月的值。)
以下是 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 ]} }
【问题讨论】:
-
您能否提供一个有问题的示例文档以及您希望如何在输出中汇总日期。这将使您的问题更加清晰。
-
我不明白方法 1 的具体要求是什么。你能告诉我们有问题的聚合吗?
标签: mongodb