Úvod

V tomto článku vám představím seskupení Mongodb podle více polí. Pro lepší pochopení se nejprve seznámíme s agregační funkcí.

Agregační funkce MongoDB

Agregační funkce se používají v klauzulích GROUP BY k agregaci seskupených dat. Agregační funkce fungují lépe při použití s klauzulí GROUP BY. Použití agregační funkce však není omezeno na seskupené dotazy.

Při použití agregační funkce v dotazu bez klauzule GROUP BY agreguje agregační funkce celou množinu výsledků (všechny řádky odpovídající klauzuli WHERE). Pokud nepoužijete klauzuli GROUP BY, lze některé agregační funkce v seznamu SELECT použít pouze s jinými agregačními funkcemi. Proto musí agregační funkce použít klauzuli GROUP BY, aby se připojila k seznamu v seznamu SELECT.

Například místo použití klauzule GROUP BY může funkce AVG v seznamu SELECT odpovídat pouze funkci SUM, ale nemůže odpovídat konkrétnímu sloupci.

Agregační operace MongoDB se používá pro dávkové operace s daty. Po seskupení kolekce podle podmínky se provede řada operací, jako je součet, průměr a další. Agregační operace mohou provádět složité operace s kolekcemi, zejména pro matematickou statistiku a dolování dat.

Vstupem agregační operace v MongoDB je dokument kolekce. Výstupem může být jeden nebo více dokumentů. MongoDB nabízí velmi výkonné agregační operace, které lze rozdělit do tří kategorií:

  • Agregační potrubí
  • Agregační operace pro jedno použití
  • Programovací modelMapReduce

Mongodb Group by Multiple Fields

Operátor $ group je agregátor, který vrací nový dokument. Má svůj vlastní operátor, pole aktuálního dokumentu můžeme získat pomocí symbolu $ + název pole. Abychom nejprve pochopili seskupení MongoDB podle více polí, podívejme se na seznam všech operátorů, které lze použít ve skupině $:

  • $ sum – Vrátí součet všech číselných polí.
  • $ avg – Vypočítá průměr mezi číselnými poli.
  • $ min – Vrátí minimální hodnotu z číselného pole
  • $ max – Získá maximální hodnotu z číselného pole.
  • $ push – Vloží hodnotu pole do výsledného pole
  • $ addToSet – Vloží hodnotu do pole výsledného dokumentu, ale nevytváří duplicity.
  • $ first – Získá pouze první dokument ze seskupených, obvykle pro třídění.
  • $ last – Vrátí poslední dokument.

Agregační pipeline

Ve vícevláknovém režimu POSIX existuje metoda zvaná pipeline, jejíž proud datových prvků je prováděn postupně sadou vláken v určeném pořadí. agregační pipeline se skládá ze stupně. Po zpracování dokumentu v jedné etapě předá agregační pipeline výsledek zpracování další etapě.

Funkce polymerní trubice Filtruje dokument a zjišťuje, které dokumenty splňují zadaná kritéria. Převést dokument a změnit výstupní podobu dokumentu.

Každá úroveň agregačního potrubí je definována pomocí operátorů etap a každý operátor etapy může používat operátory výrazů pro výpočet součtu, průměru, spojování nebo zalamování řádků před každou úrovní. Výsledek je vrácen na konci a vrácený výsledek lze přímo vypsat nebo uložit do kolekce.

Průběh zpracování

  • Db.collection.aggregate () může pro zpracování dat použít několik kanálů současně.
  • Db.collection.aggregate () používá nativní operace MongoDB pro efektivní agregaci a podporu operací, jako je GroupBy v SQL, aniž by bylo nutné psát vlastní rutiny JS.
  • Každá fáze pipeline omezuje 100 MB paměti. Pokud pipeline s jedním uzlem tento limit překročí, MongoDB vygeneruje chybu. Chcete-li zpracovávat velké množství dat, nastavte vlastnost allowDiskUse na hodnotu true, aby se data pro agregovaný uzel potrubí zapisovala do dočasného souboru a aby byl povolen paměťový limit 100 MB.
  • Db.collection.aggregate () lze použít na řadu dílků, ale výsledek se v řadě dílků nemůže ztratit. MapReduce lze aplikovat na řadu řezů a výsledek se může v řadě řezů ztratit.
  • Db.collection.aggregate () vrací kurzor, data jsou uložena v paměti a lze je spravovat přímo jako MongoShell.
  • Výstup db.collection.aggregate () lze uložit pouze do jednoho dokumentu a velikost dokumentu BSON je omezena na 16 MB.

Metoda seskupování

Použití metody group je podobné použití klauzule GROUP BY v SQL. Metoda seskupování má tři parametry:

  • Klíč: Zobrazuje klíč skupiny
  • Initial: Inicializuje pole dokumentu, které představuje skupinu dokumentů
  • Redukovat: Funkce, která vrací počet prvků. Tato funkce používá jako argumenty dva parametry: aktuální prvek a souhrnný výsledný dokument pro aktuální skupinu.
  • Keyf: nepovinný parametr. Pro reprezentaci objektu vracejícího klíč použijte jinou funkci než argument key.
  • Cond: nepovinný parametr. Určuje, že podmínka má vrátit true, jinak se dokument nezúčastní seskupení. Není-li tento parametr zadán, účastní se seskupení všechny dokumenty.
  • Finalizovat: nepovinný parametr. Představuje funkci, která je spuštěna před vrácením seskupeného výsledku.

Například:`js> db.users.group ({key: {name : true}, initial: {total : 0},reduce : function (curr, res){res.total += 1}})`

Podívejme se na výraz. Parametr key určuje, že skupina bude seskupena podle názvu: key: {name: true}

Hodnota parametru initial inicializuje pole, která představují výsledný dokument pro skupinu. V tomto případě je nastavena počáteční hodnota pole celkem. Toto pole udává počet prvků ve skupině. Protože nemusí existovat žádné prvky, inicializujeme na nulu.

Parametr reduce představuje funkci, kde parametr curr ukazuje na aktuální objekt ve skupině a res představuje aktuální skupinu. Najdeme-li jiný objekt s konkrétní hodnotou pole name, přidáme tento dokument do skupiny a zvýšíme celkovou hodnotu v dokumentu res o 1.

Použití parametru $group

Pomocí parametru $group určíme _id název klíče, který má být seskupen, pomocí statistiky vlastních polí. Použití agregační operace zruší koncept seskupení Mongodb podle více polí.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
db.users.aggregate({
$match : { age: { $gte : 18 } }
},{
$group : { _id:$username, count:{$sum:1} }
});
// Mongodb group by multiple fields
db.users.aggregate({
$match: {věk: {$gte:18} }},
$group: {_id:{uživatelské jméno:$uživatelské jméno, věk:$ge}, ‚count‘:{$sum:1} }
})
// $sum:val Přidejte val ke každému dokumentu
// $avg:val Zprůměrujte hodnotu každého dokumentu
db.users.aggregate({
$group: { _id:$username, count:{$avg:$age} }
})
db.users.aggregate({
$group: { _id:$username, count:{$max:$age} }
})
db.users.aggregate({
$group: {_id:$username, count:{$min:$age} }
})
// $first:val Staň se prvním ve skupině
db.users.aggregate({
$group:{_id:$username, count:{$first: $age} }
})
db.users.aggregate({
$group:{_id:$username, count:{$last: $age} }
})
db.users.aggregate({
$group: {_id:$username, count:{$addToSet: $age} }
})
db.users.aggregate({
$group:{_id:$username, count:{$push: $age} }
})

Mongodb seskupuje podle více polí pomocí operace Aggregate

Nejprve se vybere klíč, na kterém je seskupení založeno, a poté se kolekce rozdělí do skupin podle vybrané hodnoty klíče. Poté lze vytvořit výsledný dokument agregací dokumentů v jednotlivých skupinách.

Skupina nepodporuje fragmentované clustery a nemůže provádět shlukování do oddílů. Pokud potřebujete distribuovanou podporu, musíte použít agregaci nebo mapReduce.

1
2
3
4
5
6
7
8
9
10
11
12
13
db.collection.group(document)
{
# Seskupovací pole
key:{key1, key2:1},
# Podmínky dotazu
cond:{},
# Agregační funkce
reduce:function(current, result){},
# Inicializace
initial:{},
# Sada návratových funkcí počítání
finalize:function(){}
}

Vypočítá počet položek v každém sloupci

1
2
3
4
5
6
7
8
9
SELECT COUNT(*) FROM zboží GROUP BY category_id;
db.goods.group({
key:{category_id:1},
cond:{},// vše dohromady
reduce:function(current, result){// Odpovídá aktuálnímu řádku,result Odpovídá více řádkům ve skupině
result.total += 1;
},
initial:{total:0}
})

Závěr

Tento článek je napsán pro vývojáře, aby pochopili seskupování Mongodb podle více polí pomocí agregační funkce. Pokud se vám tento článek zdá užitečný, navštěvujte Object Rocket pro další články týkající se databází.

Pokud potřebujete poradit nebo pomoci se správou zabezpečení, škálovatelnosti nebo zálohování databáze, neváhejte nás kontaktovat na Object Rocket.

.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.