#ruby #mongodb #ruby-on-rails-3 #aggregation-framework
#ruby #mongodb #ruby-on-rails-3 #агрегация-фреймворк
Вопрос:
UserStayedTime.collection.aggregate(
{ "$match" => {
"starttime"=> {
"$gte" => start_date.to_time.utc.beginning_of_day
},
"endtime" => {
"$lte" => end_date.to_time.utc.end_of_day
}
}},
{ "$project"=> {
"y" => {"$year"=>"$starttime"},
"m"=> {"$month"=>"$starttime"},
"d"=> {"$dayOfMonth"=>"$starttime"},
"h"=> {"$hour"=>"$starttime"}
}},
{ "$group"=> {
"_id"=> {
"year"=>"$y",
"month"=>"$m",
"day"=>"$d",
"hour"=>"$h"
},
:count=> { "$sum"=> 1},
"avg"=> { "$avg" => "$stayedtime" }
}}
)
Вывод
=> [
{
"_id"=> {
"year"=>2014,
"month"=>6,
"day"=>24,
"hour"=>12
},
"count"=>12,
"avg"=>0.0
}
]
Но это неправильно, в моей базе данных у меня 12 записей с временем ожидания = 30
но я получаю неверный вывод, я имею в виду, что время ожидания не должно быть 0.0.
Пожалуйста, кто-нибудь, помогите мне
Комментарии:
1. Вы не определяете
$stayedtime
.2. где я могу определить $ stayedtime
Ответ №1:
Вы ввели проблему в свой $project
, где вы пропустили поля для документа. Лучше всего просто делать то, что вы хотели там, в $group
:
UserStayedTime.collection.aggregate(
{ "$match" => {
"starttime"=> {
"$gte" => start_date.to_time.utc.beginning_of_day
},
"endtime" => {
"$lte" => end_date.to_time.utc.end_of_day
}
}},
{ "$group"=> {
"_id"=> {
"year"=> {"$year"=>"$starttime"},
"month"=> {"$month"=>"$starttime"},
"day"=> {"$dayOfMonth"=>"$starttime"},
"hour"=> {"$hour"=>"$starttime"}
},
:count=> { "$sum"=> 1},
"avg"=> { "$avg" => "$stayedtime" }
}}
)
Таким образом, вам действительно не нужно, чтобы этот этап был отдельным, так быстрее и позволяет избежать подводных камней, таких как пропуск полей.
Комментарии:
1. @Shekar Нет проблем. Небольшой совет при изучении того, как это сделать. Еще немного советов, нажмите «Принять» в ответах, которые помогут вам здесь, поскольку я заметил, что вы не приняли ни один из ваших ответов на сегодняшний день.