MongoDB按日期和日期计算

时间:2015-12-04 20:51:13

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

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

例如:

{
  {
    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 个答案:

答案 0 :(得分:0)

你的尝试越来越近了。有一件事是,既然你是从上周过滤到自己开始的,那么你就不需要关心这一年或一个月了。

注意:我不知道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,但它不会得到你的总数。我实际上并不是单个查询中的可能。一种替代方案可能是为每个用户提供一个唯一的号码,并且只取当天的最大数字。