я хочу найти среднее время ожидания из группы документов mongo в rails

#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 Нет проблем. Небольшой совет при изучении того, как это сделать. Еще немного советов, нажмите «Принять» в ответах, которые помогут вам здесь, поскольку я заметил, что вы не приняли ни один из ваших ответов на сегодняшний день.