2015-12-04 163 views
0

我有一個帶有「創建」日期字段的用戶表。現在我想知道上週每天創建了多少新用戶,以及每天結束時(從時間開始)的總用戶數。MongoDB按日期和日期計算

例如:

{ 
    { 
    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?

+0

(1)你能告訴我們你試過了什麼嗎?我們不想爲您編寫所有的代碼。 (2)當你說總用戶數時,你是指自用戶開始或從上週開始以來的總用戶數? –

+0

@DavidGrinberg自創立以來。我編輯了我的問題以包含代碼。 – hellocrowley

回答

0

你越來越接近你的嘗試。有一件事是,因爲你開始通過過濾來擁有最後一週,所以你不需要關心年份或月份。

注意:我不知道紅寶石,所以就像我在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,但它不會讓你的總。我實際上並沒有在單個查詢中可能。另一種選擇可能是給每個用戶一個唯一的號碼,並採取當天的最大數字。

+0

你說的不需要年月。實際上這段代碼是通用的,所以我可以輸入任意範圍的日期。問題被簡化了,以避免分心:)至於total_users,我會再給它一小時並報告回來。 – hellocrowley