【问题标题】:MongoDB count by date AND to dateMongoDB 按日期和至今计数
【发布时间】:2015-12-04 20:51:12
【问题描述】:

我有一个带有“创建”日期字段的用户表。现在我想知道上周每天创建了多少新用户,以及每天结束时(从一开始)的用户总数。

例如:

{
  {
    day: 27,
    new_users: 5,
    total_users: 100
  }, {
    day: 28,
    new_users: 7,
    total_users: 107
  }, {
    day: 29,
    new_users: 2,
    total_users: 109
  }
}

我已经通过简单的分组和求和得到了 new_users 部分。下面的代码是 mongoid/Ruby。

    results = User.collection.aggregate(
    [{
      "$match" => {
          created: { "$gte" => 1.week.ago.beginning_of_day, "$lte" => Time.now }
        }
    },
    {
      "$group" => {
        _id: {
          year_joined: { "$year" => "$created" },
          month_joined: { "$month" => "$created" },
          day_joined: { "$dayOfMonth" => "$created" }
        },
        count: { "$sum" => 1 }
      }
    },
    {
      "$sort" => {"_id.year_joined" => 1, "_id.month_joined" => 1, "_id.day_joined" => 1}
    }]
  )

如何在结果中也获得 total_users?

【问题讨论】:

  • (1) 你能告诉我们你尝试了什么吗?我们不想为您编写所有代码。 (2) 当您说总用户数时,您是指从某个时间开始或从上周开始的总用户数?
  • @DavidGrinberg 从一开始。我已经编辑了我的问题以包含代码。

标签: ruby-on-rails mongodb mongoid aggregation-framework


【解决方案1】:

您的尝试已接近尾声。有一件事是,由于您是从过滤到拥有上周开始的,因此您无需关心年份或月份。

注意:我不知道 ruby​​,所以我像在 mongo shell 中一样编写它。

{
  "$match" => {
      created: { "$gte" => 1.week.ago.beginning_of_day, "$lte" => Time.now }
    }
},
{
    $group: {
        _id: {"$dayOfMonth": "$created" },
        day: {"$dayOfMonth": "$created" },
        newUsers: { "$sum": 1}
    }
},
{
      "$sort" => {"_id.year_joined" => 1, "_id.month_joined" => 1, "_id.day_joined" => 1}
}

这将为您提供daynewUsers,但不会为您提供总数。我实际上在单个查询中是不可能的。一种替代方法可能是给每个用户一个唯一的号码,然后只取当天的号码中的最大值。

【讨论】:

  • 你说得对,不需要年份和月份。实际上这个 sn-p 是通用的,所以我可以输入任意日期范围。为了避免分心,这个问题被简化了:) 至于total_users,我再等一个小时再报告。
猜你喜欢
  • 2016-02-13
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 2021-10-04
  • 2017-04-30
  • 1970-01-01
  • 1970-01-01
  • 2018-12-06
相关资源
最近更新 更多