אם MapReduce היה הבחירה שלך, יכול להיות שזה הזמן לעבור לצינור הצבירה של MongoDB להתמודדות עם פעולות מורכבות.

צינור הצבירה הוא הדרך המומלצת להרצת שאילתות מורכבות ב-MongoDB. אם השתמשת ב-MapReduce של MongoDB, כדאי שתעבור לצינור הצבירה לחישובים יעילים יותר.

מהי אגרגציה ב- MongoDB ואיך זה עובד?

צינור הצבירה הוא תהליך רב שלבי להרצה מתקדמת שאילתות ב- MongoDB. הוא מעבד נתונים דרך שלבים שונים הנקראים צינור. אתה יכול להשתמש בתוצאות שנוצרו מרמה אחת כתבנית פעולה ברמה אחרת.

לדוגמה, אתה יכול להעביר את התוצאה של פעולת התאמה לשלב אחר למיון בסדר זה עד לקבלת הפלט הרצוי.

כל שלב של צינור צבירה כולל מפעיל MongoDB ומייצר מסמך אחד או יותר שעבר טרנספורמציה. בהתאם לשאילתה שלך, רמה יכולה להופיע מספר פעמים בצנרת. לדוגמה, ייתכן שתצטרך להשתמש ב- ספירת $ אוֹ סוג $ שלבי מפעיל יותר מפעם אחת על פני צינור הצבירה.

שלבי צינור הצבירה

צינור הצבירה מעביר נתונים דרך שלבים מרובים בשאילתה אחת. ישנם מספר שלבים ואתה יכול למצוא את הפרטים שלהם ב תיעוד MongoDB.

הבה נגדיר כמה מהנפוצים ביותר בשימוש להלן.

שלב ה-$match

שלב זה עוזר לך להגדיר תנאי סינון ספציפיים לפני התחלת שלבי הצבירה האחרים. אתה יכול להשתמש בו כדי לבחור את הנתונים התואמים שברצונך לכלול בצנרת הצבירה.

instagram viewer

שלב $group

שלב הקבוצה מפריד נתונים לקבוצות שונות על סמך קריטריונים ספציפיים תוך שימוש בצמדי מפתח-ערך. כל קבוצה מייצגת מפתח במסמך הפלט.

לדוגמה, שקול את הדברים הבאים מכירות נתונים לדוגמה:

באמצעות צינור הצבירה, אתה יכול לחשב את ספירת המכירות הכוללת והמכירות המובילות עבור כל מקטע מוצר:

{
$group: {
_id: $Section,
total_sales_count: {$sum: $Sold},
top_sales: {$max: $Amount},
}
}

ה _id: $Section צמד מקבץ את מסמך הפלט על סמך הסעיפים. על ידי ציון ה ספירת_המכירות המובילה ו Top_sales שדות, MongoDB יוצר מפתחות טריים בהתבסס על הפעולה שהוגדרה על ידי הצבר; זה יכול להיות סכום $, $min, $ מקסימום, או $avg.

שלב הדילוג של $

אתה יכול להשתמש ב $דלג בשלב להשמיט מספר מוגדר של מסמכים בפלט. זה בדרך כלל מגיע אחרי שלב הקבוצות. לדוגמה, אם אתה מצפה לשני מסמכי פלט אך מדלגים על אחד, הצבירה תפלט רק את המסמך השני.

כדי להוסיף שלב דילוג, הכנס את ה- $דלג פעולה לתוך צינור הצבירה:

...,
{
$skip: 1
},

שלב ה-$sort

שלב המיון מאפשר לך לסדר נתונים בסדר יורד או עולה. לדוגמה, נוכל למיין את הנתונים בדוגמה של השאילתה הקודמת בסדר יורד כדי לקבוע לאיזה חלק יש את המכירות הגבוהות ביותר.

תוסיף את ה סוג $ אופרטור לשאילתה הקודמת:

...,
{
$sort: {top_sales: -1}
},

שלב ה-$limit

פעולת ההגבלה עוזרת להפחית את מספר מסמכי הפלט שברצונך שצינור הצבירה יציג. לדוגמה, השתמש ב- $ limit מפעיל כדי לקבל את החלק עם המכירות הגבוהות ביותר שהוחזרו בשלב הקודם:

...,
{
$sort: {top_sales: -1}
},

{"$limit": 1}

האמור לעיל מחזיר רק את המסמך הראשון; זהו הקטע עם המכירות הגבוהות ביותר, כפי שהוא מופיע בחלק העליון של הפלט הממוין.

שלב הפרויקט $

ה פרויקט $ שלב מאפשר לך לעצב את מסמך הפלט כרצונך. משתמש ב פרויקט $ אופרטור, אתה יכול לציין איזה שדה לכלול בפלט ולהתאים אישית את שם המפתח שלו.

לדוגמה, פלט לדוגמה ללא פרויקט $ השלב נראה כך:

בוא נראה איך זה נראה עם ה פרויקט $ שלב. כדי להוסיף את פרויקט $ לצינור:

...,

{
"$project": {
"_id": 0,
"Section": "$_id",
"TotalSold": "$total_sales_count",
"TopSale": "$top_sales",

}
}

מכיוון שכבר קיבצנו בעבר את הנתונים על סמך קטעי מוצר, האמור לעיל כולל כל קטע מוצר במסמך הפלט. זה גם מבטיח שספירת המכירות המצטברת והמכירות המובילות מופיעות בפלט כ TotalSold ו TopSale.

הפלט הסופי הוא הרבה יותר נקי בהשוואה לקודמו:

שלב ה-$unwind

ה $להירגע שלב מפרק מערך בתוך מסמך למסמכים בודדים. קח את הדברים הבאים הזמנות נתונים, למשל:

להשתמש ב $להירגע שלב לפרק את פריטים מערך לפני החלת שלבי צבירה אחרים. לדוגמה, התנתקות פריטים מערך הגיוני אם אתה רוצה לחשב את סך ההכנסות עבור כל מוצר:

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",

}
}
])

הנה התוצאה של שאילתת הצבירה לעיל:

כיצד ליצור צינור צבירה ב- MongoDB

בעוד שצינור הצבירה כולל מספר פעולות, השלבים שהוצגו בעבר נותנים לך מושג כיצד ליישם אותם בצנרת, כולל השאילתה הבסיסית עבור כל אחד מהם.

באמצעות הקודם מכירות דוגמה לנתונים, בוא ניקח חלק מהשלבים שנדונו לעיל במקשה אחת לתצוגה רחבה יותר של צינור הצבירה:

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",

}
}

])

הפלט הסופי נראה כמו משהו שראית בעבר:

צינור צבירה לעומת MapReduce

עד להוצאה משימוש החל מ- MongoDB 5.0, הדרך המקובלת לצבור נתונים ב- MongoDB הייתה באמצעות MapReduce. למרות ש ל- MapReduce יש יישומים רחבים יותר מעבר ל-MongoDB, זה פחות יעיל מצינור הצבירה, ומחייב סקריפטים של צד שלישי כדי לכתוב את המפה ולהפחית פונקציות בנפרד.

צינור הצבירה, לעומת זאת, הוא ספציפי ל-MongoDB בלבד. אבל הוא מספק דרך נקייה ויעילה יותר לביצוע שאילתות מורכבות. מלבד פשטות ומדרגיות שאילתות, שלבי הצינור המופיעים הופכים את הפלט להתאמה אישית יותר.

יש עוד הרבה הבדלים בין צינור הצבירה לבין MapReduce. אתה תראה אותם כשאתה עובר מ-MapReduce לצינור הצבירה.

הפוך שאילתות ביג דאטה ליעילות ב- MongoDB

השאילתה שלך חייבת להיות יעילה ככל האפשר אם אתה רוצה להריץ חישובים מעמיקים על נתונים מורכבים ב- MongoDB. צינור הצבירה אידיאלי לשאילתות מתקדם. במקום לתפעל נתונים בפעולות נפרדות, מה שלעתים קרובות מפחית את הביצועים, צבירה מאפשרת לך לארוז את כולם בתוך צינור ביצועים יחיד ולבצע אותם פעם אחת.

בעוד שצינור הצבירה יעיל יותר מ- MapReduce, אתה יכול להפוך את הצבירה למהירה ויעילה יותר על ידי הוספת הנתונים שלך לאינדקס. זה מגביל את כמות הנתונים ש-MongoDB צריך לסרוק במהלך כל שלב צבירה.