_id 및 국가별로 그룹화하려면 어떻게 해야 합니까?
-
11-12-2019 - |
문제
_id와 국가별로 그룹화해야 합니다.그룹별로 관리했습니다. _id
, 하지만 이러한 국가를 그룹화하는 방법을 알고 싶습니다. _id
s를 실행하고 각 국가의 개수를 반환합니다.
집계 프레임워크를 사용하고 있습니다.여태까지는 그런대로 잘됐다.
conn = Mongo::Connection.new
db = conn['foobar_development']
cmd = {
aggregate: 'live_daily_stats',
pipeline: [
{ '$project' => {
:metacontent => 1,
:visits => 1,
} },
{ '$unwind' => '$visits' },
{ '$match' => { 'visits.minute' => { '$gt' => 224 } } },
{ '$sort' => { 'visits.minute' => 1 } },
{ '$group' => {
:_id => '$_id',
:visits => { '$push' => '$visits' },
:visits_count => { '$sum' => 1 },
:metacontent => { '$addToSet' => '$metacontent' },
}
},
{ '$sort' => { 'visits_count' => -1 } },
]
}
res = db.command(cmd)['result']
다음이 반환됩니다.
[
[0] {
"_id" => "20120726/foobar/song/custom-cred",
"visits" => [
[0] {
"country_name" => "UK",
"iso_two_letter_country_code" => "UK",
"referer" => "http://localhost:3000/",
"minute" => 59,
"token_id" => "134326199711wfryhpdq"
},
[1] {
"country_name" => "UK",
"iso_two_letter_country_code" => "UK",
"referer" => "http://localhost:3000/",
"minute" => 59,
"token_id" => "134326199711wfryhpdq"
},
[2] {
"country_name" => "US",
"iso_two_letter_country_code" => "US",
"referer" => "http://localhost:3000/",
"minute" => 59,
"token_id" => "134326199711wfryhpdq"
}
],
"visits_count" => 1,
"metacontent" => [
[0] {
"date" => "20120726"
}
]
},
[1] {
"_id" => "20120725/foobar/song/test-pg3-long-title-here-test-lorem-ipsum-dolor-lo",
"visits" => [
[0] {
"country_name" => "UK",
"iso_two_letter_country_code" => "UK",
"referer" => "http://localhost:3000/",
"minute" => 58,
"token_id" => "13432600883knjzcbic"
}
],
"visits_count" => 1,
"metacontent" => [
[0] {
"date" => "20120725"
}
]
}
]
해결책
나는 $group
둘 다 연결하기 _id
그리고 country_name
:
cmd = {
aggregate: 'live_daily_stats',
pipeline: [
{ '$project' => {
:metacontent => 1,
:visits => 1,
} },
{ '$unwind' => '$visits' },
{ '$match' => { 'visits.minute' => { '$gt' => 224 } } },
{ '$sort' => { 'visits.minute' => 1 } },
{ '$group' => {
:_id => { '$add' => ['$_id', '$visits.country_name']},
:visits => { '$push' => '$visits' },
:visits_count => { '$sum' => 1 },
:metacontent => { '$addToSet' => '$metacontent' },
}
},
{ '$sort' => { 'visits_count' => -1 } },
]
}
다른 팁
$ GROUP가 계산할 목적으로 문서를 그룹화합니다. 문서 모음을 기반으로 값을 집계합니다. 거의, 그룹은 종종 각 페이지의 평균 페이지보기와 같은 작업을 지원합니다. 매일 웹 사이트.
$ GROUP의 출력은 그룹을 정의하는 방법에 따라 다릅니다. 부터 시작하다 그룹의 식별자 (즉, _id 필드)를 지정하는 것 이 파이프 라인을 만드는 것. 그 이름에서 단일 필드를 지정할 수 있습니다 파이프 라인의 문서, 이전에 계산 된 값 또는 여러 개의 들어오는 필드에서 구성된 집계 키.
모든 그룹 표현식은 _id 필드를 지정해야합니다. 당신은 그를 지정할 수 있습니다 _id 필드 점선 필드 경로 참조, 중괄호 (즉, I. {and}) 또는 일정한 값으로 묶인 여러 필드가있는 문서.
_id와 국가가 처음으로 그룹화하려고합니다 (원하는 카운트를 수행 할 수 있음). 그런 다음 _ID로 결과를 그룹화하여 원하는 구조를 제공합니다.
업데이트 :
나는 이렇게 생각하고있었습니다. 그러나 나는 그것을 확인하기위한 env 설정이 없습니다 ..
.conn = Mongo::Connection.new db = conn['foobar_development'] cmd = { aggregate: 'live_daily_stats', pipeline: [ { '$project' => { :metacontent => 1, :visits => 1, } }, { '$unwind' => '$visits' }, { '$match' => { 'visits.minute' => { '$gt' => 224 } } }, { '$sort' => { 'visits.minute' => 1 } }, { '$group' => { :_id => {'$_id','$visits.iso_two_letter_country_code'}, :page_id => '$_id', :visits_count => { '$sum' => 1 }, .... whatever you want ... :metacontent => { '$addToSet' => '$metacontent' }, } }, { '$group' => { :_id => '$page_id', .... whatever you want ... } }, { '$sort' => { 'visits_count' => -1 } }, ] } res = db.command(cmd)['result']