Wie gruppiere ich nach _id und Land?
-
11-12-2019 - |
Frage
Ich muss nach _id und Ländern gruppieren.Ich habe es geschafft, nach Gruppen zu gruppieren _id
, würde aber gerne wissen, wie man die Länder darin gruppiert _id
s und geben Sie die Anzahl für jedes Land zurück.
Ich verwende das Aggregationsframework.So weit, ist es gut.
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']
Folgendes wird zurückgegeben:
[
[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"
}
]
}
]
Lösung
Ich habe das geändert $group
beides zu verknüpfen _id
Und 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 } },
]
}
Andere Tipps
$ gruppengruppen dokumentiert zusammen, um aggregatwerte Werte basierend auf einer Sammlung von Dokumenten zu berechnen.Praktisch unterstützt die Gruppe täglich Aufgaben wie durchschnittliche Seitenansichten für jede Seite in einer Website.
Die Ausgabe von $group hängt davon ab, wie Sie Gruppen definieren.Beginnen Sie mit der Angabe einer Kennung (dhein _id -Feld) für die Gruppe, die Sie mit dieser Pipeline erstellen.Sie können ein einzelnes Feld aus den Dokumenten in der Pipeline, einem zuvor berechneten Wert oder einem aggregierten Schlüssel angeben, das aus mehreren eingehenden Feldern besteht.
Jeder Gruppenausdruck muss ein _id-Feld angeben.Sie können das Feld _id als eine gepunktete Feldpfadreferenz angeben. ein Dokument mit mehreren Feldern in geschweiften Klammern (z. B.{ Und }), oder ein konstanter Wert.
Ich würde versuchen, zuerst sowohl nach _id als auch nach Land zu gruppieren (damit Sie die gewünschte Zählung durchführen können) und dann das Ergebnis nur nach _id zu gruppieren, um die gewünschte Struktur zu erhalten.
Aktualisiert:
Ich habe so etwas gedacht..aber ich habe kein Env-Setup, um es zu überprüfen.
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']