צבירות MongoDB באמצעות Java

1. סקירה כללית

במדריך זה נצא לצלול אל ה- מסגרת צבירה של MongoDB באמצעות מנהל ההתקן Java של MongoDB.

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

2. מה הם צבירות?

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

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

ניתן לסכם את השלבים הנפוצים ביותר:

שלבשווה ערך ל- SQLתיאור
פּרוֹיֶקטבחרבוחר רק את השדות הנדרשים, יכול לשמש גם לחישוב ולהוספת שדות נגזרים לאוסף
התאמהאיפהמסנן את האוסף לפי הקריטריונים שצוינו
קְבוּצָהקבוצה לפיאוסף קלט יחד לפי הקריטריונים שצוינו (למשל ספירה, סכום) להחזרת מסמך לכל קבוצה נפרדת
סוגמיין לפיממיין את התוצאות בסדר עולה או יורד של שדה נתון
לספורלספורסופר את המסמכים שהאוסף מכיל
לְהַגבִּיללְהַגבִּילמגביל את התוצאה למספר מסוים של מסמכים, במקום להחזיר את כל האוסף
הַחוּצָהבחר ב- NEW_TABLEכותב את התוצאה לאוסף בעל שם; שלב זה מקובל רק בתור האחרון בצינור

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

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

3. הגדרת מסד נתונים

3.1. מערך נתונים

הדרישה הראשונה והעיקרית ללימוד כל דבר שקשור למסד נתונים היא מערך הנתונים עצמו!

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

  • שֵׁם - שם המדינה; לדוגמה, ארצות הברית
  • alpha3Code - קוד קוד לשם המדינה; לדוגמה, IND (להודו)

  • אזור - האזור אליו שייכת המדינה; לדוגמה, אֵירוֹפָּה
  • אֵזוֹר - האזור הגיאוגרפי של המדינה
  • שפות - שפות רשמיות של המדינה במתכונת מערך; לדוגמה, אנגלית
  • גבולות - מגוון של מדינות שכנות alpha3Codeס

עכשיו בואו נראה כיצד להמיר נתונים אלה לאוסף במסד נתונים של MongoDB.

3.2. מייבא ל- MongoDB

ראשית, אנחנו צריכים פגע בנקודת הקצה של ה- API כדי להשיג את כל המדינות ולשמור את התגובה באופן מקומי בקובץ JSON. השלב הבא הוא לייבא אותו ל- MongoDB באמצעות ה- mongoimport פקודה:

mongoimport.exe - db - אוסף - קובץ - jsonArray

ייבוא ​​מוצלח אמור לתת לנו אוסף עם 250 מסמכים.

4. דוגמאות צבירה בג'אווה

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

אך לפני שנעשה זאת, עלינו ליצור קשר למסד הנתונים:

@BeforeClass בטל סטטי פומבי setUpDB () זורק IOException {mongoClient = MongoClients.create (); מסד נתונים = mongoClient.getDatabase (DATABASE); collection = database.getCollection (COLLECTION); } 

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

לקריאה טובה יותר של קטעי המידע שלנו, אנו יכולים להוסיף ייבוא ​​סטטי:

ייבא com.mongodb.client.model.Aggregates סטטי. *;

4.1. התאמה ו לספור

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

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

@ מבחן בטל פומבי שניתןCountryCollection_whenEnglishSpeakingCountriesCounted_thenNinetyOne () {Document englishSpeakingCountries = collection.aggregate (Arrays.asList (match (Filters.eq ("languages.name", "English")), count ())). First (); assertEquals (91, englishSpeakingCountries.get ("ספירה")); }

כאן אנו משתמשים בשני שלבים בצינור הצבירה שלנו: התאמה ו לספור.

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

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

4.2. קְבוּצָה (עם סְכוּם) ו סוג

בדוגמה זו, המטרה שלנו היא גלה את האזור הגיאוגרפי המכיל את המספר המרבי של מדינות:

@Test ציבורי בטל givenCountryCollection_whenCountedRegionWise_thenMaxInAfrica () {Document maxCountriedRegion = collection.aggregate (Arrays.asList (group ("$ region", Accumulators.sum ("tally", 1)), sort (Sorts.descending ("tally")) ).ראשון(); assertTrue (maxCountriedRegion.containsValue ("אפריקה")); }

כפי שניכר, אנחנו משתמשים קְבוּצָה ו סוג כדי להשיג את המטרה שלנו כאן.

ראשית, אנו אוספים את מספר המדינות בכל אזור על ידי צבירת א סְכוּם מההתרחשויות שלהם במשתנה לִסְפּוֹר. זה נותן לנו אוסף ביניים של מסמכים, שכל אחד מהם מכיל שני שדות: האזור וסך המדינות בו. לאחר מכן אנו ממיינים אותו בסדר יורד ומחלצים את המסמך הראשון שייתן לנו את האזור עם מקסימום מדינות.

4.3. סוג,לְהַגבִּיל, ו הַחוּצָה

עכשיו בואו נשתמש סוג, לְהַגבִּיל ו הַחוּצָה לחלץ את שבע המדינות הגדולות מבחינה אזורית ולכתוב אותן לאוסף חדש:

@Test ציבורי בטל givenCountryCollection_whenAreaSortedDescending_thenSuccess () {collection.aggregate (Arrays.asList (מיון (Sorts. Descending ("אזור")), מגבלה (7), החוצה ("most_seven"))). ToCollection (); MongoCollection largestSeven = database.getCollection ("הגדול_שבע"); assertEquals (7, largestSeven.countDocuments ()); מסמך ארה"ב = הגדול ביותר Seven.Find (Filters.eq ("alpha3Code", "ארה"ב")). ראשון (); assertNotNull (ארה"ב); }

כאן מינינו לראשונה את האוסף הנתון בסדר יורד של אֵזוֹר. ואז השתמשנו ב- מגבלה מס '# שיטה להגבלת התוצאה לשבעה מסמכים בלבד. לבסוף, השתמשנו ב- הַחוּצָה שלב לערוק נתונים אלה לאוסף חדש שנקרא הגדול_שבע. כעת ניתן להשתמש באוסף זה באותו אופן כמו כל אחר - למשל ל- למצוא אם הוא מכיל ארה"ב.

4.4. פרויקט, קבוצה (עם מקסימום), התאמה

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

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

@ מבחן בטל פומבי givenCountryCollection_whenNeighborsCalculated_thenMaxIsFifteenInChina () {Bson borderingCountriesCollection = פרויקט (Projections.fields (Projections.excludeId (), Projections.include ("name"), Projections.computed ("borderingCountries", Projections " גבולות $ ")))); int maxValue = collection.aggregate (Arrays.asList (bordereringCountriesCollection, group (null, Accumulators.max ("max", "$ bordereringCountries")))). first (). getInteger ("max"); assertEquals (15, maxValue); מסמך maxNeighboredCountry = collection.aggregate (Arrays.asList (bordereringCountriesCollection, match (Filters.eq ("grensingCountries", maxValue))). ראשון (); assertTrue (maxNeighboredCountry.containsValue ("סין")); }

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

5. מסקנה

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

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

לקריאה נוספת, Spring Data MongoDB מספק דרך חלופית להתמודד עם תחזיות וצבירות ב- Java.

כמו תמיד, קוד המקור זמין ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found