【问题标题】:group by day/month and take average of rating on that day/month in mongo按天/月分组,并在 mongo 中取该天/月的平均评分
【发布时间】:2018-11-05 21:31:10
【问题描述】:

我在 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 中怎么做?

【问题讨论】:

    标签: mongodb date group-by


    【解决方案1】:

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

    这可以在 $group 步骤之前的 $project 阶段完成,但由于 $group 管道没有必要主要容纳accumulator 运算符。

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

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

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

    【讨论】:

    • 如果我想添加$match,我该怎么做?我试过了,但它总是给我空数组,而不是数据可用于 $match 查询。
    • 您的过滤标准是什么?您没有在问题中明确提及过滤器,请相应地更新您的问题,以便我可以使用$match 过滤器更新我的答案。
    • 好的。我想通了,它奏效了。但是如果我想按月或周分组,那我该怎么做呢?投影后需要再做一组吗?
    • 看来原来的问题解决了不是吗?至于“下一个”问题,那就是different question,考虑单独发一下。
    【解决方案2】:

    对于集合,使用aggregate()$group,将$month_id 分组来自文档的ceatedAt(原文如此)字段,并将month 字段放在输出的文档等于该值。

    然后,创建一个名为ceatedAt 的字段,使用$dateToStringformat 输入文档的$date 字段为"%Y-%m-%d"

    最后,在您的分组文档中创建一个名为average 的字段,即输入文档的$rating 字段的$avg

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

    【讨论】:

    • 我收到一个错误:unknown group operator '$dateToString'
    • @phantophoenix 在您的控制台中输入mongo -v。您需要 3.0 或更高版本。
    • 我正在运行 3.4 并且我得到与 @nirvair 相同的错误,除非我使用 $dateToString 作为 _id 字段的值。然后它起作用了,但只有那时。正是这些不一致让我对 Mongo 感到沮丧。
    猜你喜欢
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多