mongodb - 按天/月分组,并在 mongo 中取该天/月的平均评分

标签 mongodb date group-by

我在 mongodb 中有这些数据:

[
  {
    "rating": 4,
    "ceatedAt": ISODate("2016-08-08T15:32:41.262+0000")
  },
  {
    "rating": 3,
    "createdAt": ISODate("2016-08-08T15:32:41.262+0000")
  },
  {
    "rating": 3,
    "ceatedAt": ISODate("2016-07-01T15:32:41.262+0000")
  },
  {
    "rating": 5,
    "createdAt": ISODate("2016-07-01T15:32:41.262+0000")
  }
]

我需要根据过滤条件获取特定日期/月份的平均评分。 如果日期的过滤范围小于一个月,那么它将按天分组。如果日期的过滤范围超过一个月,那么它将按月分组。

这正是我所期待的

[
  {
    "average": 3.5,
    "ceatedAt": "2016-08-08",
    "month": "August"
  },
  {
    "average": 4,
    "ceatedAt": 2016-07-01,
    "month": "July"
  }
]

在 mongodb 中怎么做?

最佳答案

要按日/月对文档进行分组并在输出中返回月份键,您需要首先 $project 使用 Date 将关键字段转换为适当的格式运算符,尤其是 $dateToString $month 运算符。

这可以在 $project 中完成 $group 之前的 阶段 步骤,但不是必需的,因为 $group 管道主要容纳 accumulator运营商。

在前面的 $group 管道,您可以按格式化日期键对文档进行分组,使用 $avg 聚合 运算符并使用 $first 从上一个管道中以整数形式返回月份 累加器运算符。

运行以下聚合管道应该会给您想要的结果:

db.collection.aggregate([
  { "$group": {
    "_id": { 
        "$dateToString": { "format": "%Y-%m-%d", "date": "$ceatedAt" } 
    },
    "average": { "$avg": "$rating" },
    "month": { "$first": { "$month": "$ceatedAt" } },
  } }
]) 

关于mongodb - 按天/月分组,并在 mongo 中取该天/月的平均评分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38897478/

相关文章:

ios - 内部查询解析

node.js - MongoDB 中的一对多关系

ruby-on-rails - 遍历过去 7 天的日期

sql - 选择带别名的 SQL 查询并加入

sql - rails/SQL : Group by and sum each day in the last 2 weeks

javascript 将对象数组转换为字符串以存储在 s3 中

javascript - 在与现有 NodeJS 应用程序相同的 AWS EC2 实例上安装 MongoDB?

mysql - 在 MySQL 中使用 varchar 而不是日期字段类型

用于查找字符串是否包含 YYYY-MM-DD 的 PHP 正则表达式

sql - GROUP BY Apache Hive中的错误