Ha a MapReduce volt az Ön kedvence, most itt az ideje, hogy áttérjen a MongoDB Aggregation Pipeline-jára az összetett műveletek kezelésére.
Az aggregációs folyamat az összetett lekérdezések futtatásának ajánlott módja a MongoDB-ben. Ha a MongoDB MapReduce-ját használta, jobb, ha az aggregációs folyamatra vált a hatékonyabb számítások érdekében.
Mi az aggregáció a MongoDB-ben és hogyan működik?
Az összesítő folyamat egy többlépcsős folyamat a haladó futtatásához lekérdezések a MongoDB-ben. Az adatokat különböző szakaszokon, úgynevezett csővezetékeken keresztül dolgozza fel. Az egyik szintről generált eredményeket műveleti sablonként használhatja egy másikon.
Például átadhatja egy egyeztetési művelet eredményét egy másik szakaszba a rendezés érdekében, amíg meg nem kapja a kívánt kimenetet.
Az összesítési folyamat minden egyes szakasza tartalmaz egy MongoDB-operátort, és egy vagy több átalakított dokumentumot generál. A lekérdezéstől függően egy szint többször is megjelenhet a folyamatban. Például előfordulhat, hogy a
$count vagy $sort operátor többször lép fel az aggregációs csővezetéken keresztül.Az aggregációs csővezeték szakaszai
Az aggregációs folyamat egyetlen lekérdezésben több szakaszon keresztül továbbítja az adatokat. Több szakasza van, és ezek részleteit a MongoDB dokumentáció.
Az alábbiakban definiáljunk néhányat a leggyakrabban használtak közül.
A $match Stage
Ez a szakasz segít konkrét szűrési feltételek meghatározásában a többi összesítési szakasz megkezdése előtt. Segítségével kiválaszthatja az egyező adatokat, amelyeket fel kíván venni az összesítési folyamatba.
A $csoportszínpad
A csoportszakasz az adatokat kulcs-érték párok segítségével meghatározott kritériumok alapján különböző csoportokra osztja. Mindegyik csoport egy kulcsot jelent a kimeneti dokumentumban.
Vegyük például a következőket értékesítés minta adat:
Az összesítési folyamat segítségével kiszámíthatja az egyes termékszakaszok teljes értékesítési számát és legnagyobb eladásait:
{
$group: {
_id: $Section,
total_sales_count: {$sum: $Sold},
top_sales: {$max: $Amount},
}
}
A _id: $Section pár csoportosítja a kimeneti dokumentumot a szakaszok alapján. Megadva a top_sales_count és top_sales mezők, a MongoDB friss kulcsokat hoz létre az aggregátor által meghatározott művelet alapján; ez lehet $összeg, $min, $max, vagy $átl.
A $skip színpad
Használhatja a $skip szakaszban megadott számú dokumentum kihagyásához a kimenetben. Általában a csoportkör után jön. Például, ha két kimeneti dokumentumot vár, de egyet kihagy, az összesítés csak a második dokumentumot adja ki.
Kihagyási szakasz hozzáadásához illessze be a $skip művelet az aggregációs csővezetékbe:
...,
{
$skip: 1
},
A $sort Stage
A rendezési szakasz lehetővé teszi az adatok csökkenő vagy növekvő sorrendbe rendezését. Például tovább rendezhetjük az előző lekérdezési példában szereplő adatokat csökkenő sorrendben, hogy meghatározzuk, melyik szakaszban van a legmagasabb az eladás.
Add hozzá a $sort operátor az előző lekérdezéshez:
...,
{
$sort: {top_sales: -1}
},
A $limit szakasz
A limitművelet segít csökkenteni azon kimeneti dokumentumok számát, amelyeket meg kíván jeleníteni az összesítési folyamat. Például használja a $limit operátort, hogy megkapja az előző szakasz által visszaadott legnagyobb értékesítési szakaszt:
...,
{
$sort: {top_sales: -1}
},
{"$limit": 1}
A fenti csak az első dokumentumot adja vissza; ez az a rész, ahol a legnagyobb az eladások, ahogyan ez a rendezett kimenet tetején jelenik meg.
A $projekt Színpad
A $projekt szakasz lehetővé teszi a kimeneti dokumentum tetszés szerinti alakítását. Használni a $projekt operátorral megadhatja, hogy melyik mező szerepeljen a kimenetben, és testreszabhatja a kulcs nevét.
Például egy minta kimenet nélkül a $projekt a színpad így néz ki:
Lássuk, hogy néz ki a $projekt színpad. Hozzáadni a $projekt a csővezetékhez:
...,{
"$project": {
"_id": 0,
"Section": "$_id",
"TotalSold": "$total_sales_count",
"TopSale": "$top_sales",
}
}
Mivel korábban termékszakaszok alapján csoportosítottuk az adatokat, a fentiek minden termékszakaszt tartalmaznak a kimeneti dokumentumban. Azt is biztosítja, hogy az összesített értékesítési szám és a legnagyobb eladások szerepeljenek a kimenetben TotalSold és TopSale.
A végső kimenet sokkal tisztább az előzőhöz képest:
A $unwind Színpad
A $nyugodj le szakasz a dokumentumon belüli tömböt egyedi dokumentumokra bontja. Vegyük a következőket Megrendelések adatok például:
Használja a $nyugodj le szakaszban dekonstruálni a tételeket tömböt, mielőtt más összesítési szakaszt alkalmazna. Például letekerve a tételeket A tömbnek van értelme, ha ki szeretné számítani az egyes termékek teljes bevételét:
db.Orders.aggregate(
[
{
"$unwind": "$items"
},
{
"$group": {
"_id": "$items.product",
"total_revenue": { "$sum": { "$multiply": ["$items.quantity", "$items.price"] } }
}
},
{
"$sort": { "total_revenue": -1 }
},{
"$project": {
"_id": 0,
"Product": "$_id",
"TotalRevenue": "$total_revenue",
}
}
])
Íme a fenti összesítési lekérdezés eredménye:
Hogyan hozzunk létre aggregációs csővezetéket a MongoDB-ben
Míg az összesítési folyamat számos műveletet tartalmaz, a korábban bemutatott szakaszok ötletet adnak arról, hogyan alkalmazhatja ezeket a folyamatban, beleértve az egyes műveletek alapvető lekérdezését.
Az előző felhasználásával értékesítés adatminta, nézzünk meg néhány fent tárgyalt szakaszt egy darabban az összesítési folyamat tágabb áttekintése érdekében:
db.sales.aggregate([
{
"$match": {
"Sold": { "$gte": 5 }
}
},{
"$group": {
"_id": "$Section",
"total_sales_count": { "$sum": "$Sold" },
"top_sales": { "$max": "$Amount" },
}},
{
"$sort": { "top_sales": -1 }
},{"$skip": 0},
{
"$project": {
"_id": 0,
"Section": "$_id",
"TotalSold": "$total_sales_count",
"TopSale": "$top_sales",
}
}
])
A végső kimenet úgy néz ki, mint amit korábban láttál:
Aggregációs csővezeték vs. MapReduce
A MongoDB 5.0-tól kezdődő elavulásáig az adatok MongoDB-ben való összesítésének hagyományos módja a MapReduce volt. Habár A MapReduce szélesebb körű alkalmazásokkal rendelkezik a MongoDB-n túl kevésbé hatékony, mint az aggregációs folyamat, ezért harmadik féltől származó parancsfájlokra van szükség a térkép megírásához és a funkciók külön-külön történő csökkentéséhez.
Az aggregációs folyamat viszont csak a MongoDB-re vonatkozik. De tisztább és hatékonyabb módja az összetett lekérdezések végrehajtásának. Az egyszerűség és a lekérdezés méretezhetősége mellett a kiemelt folyamatszakaszok testreszabhatóbbá teszik a kimenetet.
Sok más is van különbségek az aggregációs folyamat és a MapReduce között. Látni fogja őket, amikor a MapReduce-ról az összesítő folyamatra vált.
Tedd hatékonyan a nagy adatlekérdezéseket a MongoDB-ben
A lekérdezésnek a lehető leghatékonyabbnak kell lennie, ha mélyreható számításokat szeretne futtatni a MongoDB összetett adatain. Az összesítő folyamat ideális haladó szintű lekérdezéshez. Ahelyett, hogy külön műveletekben kezelné az adatokat, ami gyakran csökkenti a teljesítményt, az aggregáció lehetővé teszi, hogy az összeset egyetlen teljesítményfolyamatba csomagolja, és egyszer végrehajtsa.
Bár az összesítési folyamat hatékonyabb, mint a MapReduce, az adatok indexelésével gyorsabbá és hatékonyabbá teheti az összesítést. Ez korlátozza a MongoDB-nek az egyes összesítési szakaszok során vizsgálandó adatok mennyiségét.