_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フィールド)を指定する このパイプラインで作成します。から単一のフィールドを指定できます Pipeline、以前に計算された値、または いくつかの着信フィールドから構成された集約キー。
すべてのグループ式は_idフィールドを指定する必要があります。あなたはを指定することができます _IDフィールドは点線フィールド経路参照として、ブレースで囲まれた複数のフィールド(すなわち{および})、または定数値を持つ文書。
最初に_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']