문제

_id와 국가별로 그룹화해야 합니다.그룹별로 관리했습니다. _id, 하지만 이러한 국가를 그룹화하는 방법을 알고 싶습니다. _ids를 실행하고 각 국가의 개수를 반환합니다.

집계 프레임워크를 사용하고 있습니다.여태까지는 그런대로 잘됐다.

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']
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top