如何按 _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 } },
]
}
其他提示
从文档
$组组文件一起用于计算的目的 基于文件集合的聚合值。几乎, 小组经常支持每个页面的平均页面视图等任务 每天一个网站。
$组的输出取决于您如何定义组。首先 为您提供的组指定标识符(即_ID字段) 用这个管道创建。您可以从中指定单个字段 管道中的文档,先前计算的值或 从几个传入字段组成的聚合密钥。
每个组表达式都必须指定_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']