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

instagram viewer
$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.