【问题标题】:Mongoid Grouping by dateMongoid 按日期分组
【发布时间】:2015-04-17 01:34:33
【问题描述】:

这是我拥有的那种文件:

{
  event_type: 'click',
  created_at: '2015-02-15 10:00:00',
  user_id: 100
}

我需要使用 event_type = click 来汇总每天的唯一用户数。 得到类似的东西:

{
  count: 320,
  date: '2015-02-15'
}

{
  count: 451,
  date: '2015-02-16'
}

(注意日期格式)

我已经尝试了很多我在 SO 上找到的不同的东西,这个几乎对我有用: Best way to group by date with Mongoid 我只是不知道如何修改它以完全满足我的需要。

这是几乎可以实现我想用 Mongoid 实现的原始查询:

db.events.aggregate([
  {$match: {event_type: 'click', created_at: {
    $gte: ISODate('2015-01-01T00:00:00.000Z'),
    $lt: ISODate('2016-01-01T00:00:00.000Z')
  }}},
  {$group: {
      _id: {user_id: '$user_id', account_id: '$account_id', created_at: {
           day: { $dayOfMonth: '$created_at' },
           month: { $month: '$created_at' },
           year: { $year: '$created_at'}
       }},
      'count': {'$sum': 1}
      }
  },
  {$sort: {created_at: -1}},
])

有什么建议吗?

【问题讨论】:

  • 你的created_at日期是ISO日期还是字符串?
  • created_at 是 ISO 日期

标签: ruby-on-rails mongodb mongoid


【解决方案1】:

在 mongo 2.8 $dateToString 中提供了将 ISO 日期转换为字符串格式的功能,因此下面的查询可能会解决您的问题

    db.collectionName.aggregate({
    "$match": {
    "event_type": "click"
    }
}, {
    "$project": {
    "yearMonthDay": {
        "$dateToString": {
            "format": "%Y-%m-%d",
            "date": "$created_at"
        }
    },
    "user_id": "$user_id"
    }
}, {
    "$group": {
    "_id": {
        "user_id": "$user_id",
        "date": "$yearMonthDay"
    }
    }
}, {
    "$group": {
    "_id": "$_id.date",
    "count": {
        "$sum": "$_id.user_id"
    }
    }
}, {
    "$project": {
    "date": "$_id",
    "count": "$count",
    "_id": 0
    }
})

在上面的查询中,第一组按日期和 user_id 创建组,第二组再次根据日期计算 user_id 的总和

【讨论】:

  • 谢谢。我使用 v2.6,所以我会尝试找到一种方法来与当前版本做类似的事情,看看它是否适合我。你能解释一下你做了什么让它工作吗?我看到你有多个 $group 和 $project 查询,这是为什么呢?
  • 知道如何通过 Mongoid 运行这个原始查询吗?还是用 Mongoid 写?
  • 我认为如果您需要更多帮助,请查看http://stackoverflow.com/questions/25176855/data-type-conversion-in-mongodb
  • 是的,如果您能够将 mongo 升级到较新版本,则无法直接将 ISO 日期转换为低于 2.8 版本的字符串,但在 2.8 及更高版本中使用 datToString 直接转换,然后使用这个:)
  • 2.8 尚未发布! 2.6 仍然是 2015 年 2 月的最新版本。此外,2.8 已重命名为 3.0,因此 2.6 之后的下一个生产版本号将是 3.0。
猜你喜欢
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-05
  • 2021-09-30
  • 2012-05-28
  • 2011-12-30
相关资源
最近更新 更多