Spring Data MongoDB: תחזיות וצבירות

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

Spring Data MongoDB מספק הפשטות פשוטות ברמה גבוהה לשפת השאילתה המקורית של MongoDB. במאמר זה, נחקור את התמיכה במסגרת התחזיות והמסגרות.

אם אתה חדש בנושא זה, עיין במאמר ההיכרות שלנו מבוא ל- Data Data MongoDB.

2. הקרנה

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

עם Spring Data MongDB, ניתן להשתמש בתחזיות גם יחד עם MongoTemplate ו מאגר מאגר.

לפני שנתקדם הלאה, בואו נסתכל על מודל הנתונים בו נשתמש:

משתמש @Document מחלקה ציבורית {@Id פרטי מחרוזת; שם מחרוזת פרטי; גיל שלם פרטי; // סטרים וקובעים סטנדרטיים}

2.1. תחזיות באמצעות MongoTemplate

ה לִכלוֹל() ו אל תכלול () שיטות על שדה מחלקה משמשת לכלול ולא כולל שדות בהתאמה:

שאילתת שאילתות = שאילתה חדשה (); query.fields (). include ("שם"). exclude ("id"); רשימת john = mongoTemplate.find (שאילתה, User.class);

ניתן לכבוש שיטות אלה יחד כדי לכלול או לא לכלול שדות מרובים. השדה מסומן כ @תְעוּדַת זֶהוּת (_תְעוּדַת זֶהוּת במסד הנתונים) תמיד נשלף אלא אם כן לא נכלל במפורש.

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

לדוגמה, חוּט יהיה ריק, int/מספר שלם יהיה 0 ו בוליאני/בוליאני יהיה שֶׁקֶר.

כך בדוגמה שלעיל, שֵׁם שדה יהיה ג'ון, תְעוּדַת זֶהוּת יהיה ריק ו גיל יהיה 0.

2.2. תחזיות באמצעות מאגר מאגר

תוך שימוש ב- MongoRepositories, ה- שדות שֶׁל @שאילתא ניתן להגדיר הערה בפורמט JSON:

@Query (value = "{}", שדות = "{name: 1, _id: 0}") רשימה findNameAndExcludeId ();

התוצאה תהיה זהה לשימוש ב- MongoTemplate. ה ערך = "{}" לא מציין שום פילטרים ולכן כל המסמכים ייאספו.

3. צבירה

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

Spring Data MongoDB מספק הפשטה לשאילתות צבירה מקוריות באמצעות שלוש הכיתות צבירה העוטף שאילתת צבירה, AggregationOperation העוטף שלבי צינור בודדים ו תוצאות Aggregation שהוא מיכל התוצאה המיוצר בצבירה.

כדי לבצע ולצבור, ראשית, צור צינורות צבירה בשיטות בונה סטטי ב- צבירה ואז ליצור מופע של צבירה משתמש ב newAggregation () שיטה על צבירה בכיתה ולבסוף להריץ את הצבירה באמצעות MongoTemplate:

MatchOperation matchStage = Aggregation.match (קריטריונים חדשים ("foo"). Is ("bar")); ProjectionOperation projectStage = Aggregation.project ("foo", "bar.baz"); צבירה של צבירה = Aggregation.newAggregation (matchStage, projectStage); פלט AggregationResults = mongoTemplate.aggregate (צבירה, "foobar", OutType.class);

שימו לב ששניהם MatchOperation ו הקרנה פעולה ליישם AggregationOperation. קיימות יישומים דומים עבור צינורות צבירה אחרים. OutType הוא מודל הנתונים לתפוקה הצפויה.

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

מערך הנתונים בו נשתמש במאמר זה מפרט פרטים על כל המיקודים בארה"ב אותם ניתן להוריד ממאגר MongoDB.

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

{"_id": "01001", "city": "AGAWAM", "loc": [-72.622739, 42.070206], "pop": 15338, "state": "MA"}

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

3.1. קבל את כל המדינות עם אוכלוסייה גדולה מ- 10 מיליון סדר לפי אוכלוסייה יורדת

כאן יהיו לנו שלושה צינורות:

  1. קבוצת $ שלב המסכם את אוכלוסיית כל המיקודים
  2. התאמה $ שלב לסינון מדינות עם אוכלוסייה מעל 10 מיליון
  3. $ sort שלב למיין את כל המסמכים לפי סדר אוכלוסייה יורד

לתפוקה הצפויה יהיה שדה _תְעוּדַת זֶהוּת כמדינה וכשדה statePop עם כלל אוכלוסיית המדינה. בואו ניצור מודל נתונים לכך ונפעיל את הצבירה:

StatePoulation ממעמד ציבורי {@ Id פרטי מחרוזת; מדינת שלם פרטית StatePop; // סטרים וקובעים סטנדרטיים}

ה @תְעוּדַת זֶהוּת ההערה תמפה את _תְעוּדַת זֶהוּת שדה מפלט ל מדינה במודל:

GroupOperation groupByStateAndSumPop = group ("state") .sum ("pop"). As ("statePop"); MatchOperation filterStates = התאמה (קריטריונים חדשים ("statePop"). Gt (10000000)); SortOperation sortByPopDesc ​​= sort (Sort.by (Direction.DESC, "statePop")); צבירת צבירה = newAggregation (groupByStateAndSumPop, filterStates, sortByPopDesc); AggregationResults result = mongoTemplate.aggregate (צבירה, "רוכסנים", StatePopulation.class);

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

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

3.2. קבל מדינה קטנה ביותר לפי אוכלוסייה ממוצעת בעיר

לבעיה זו נצטרך ארבעה שלבים:

  1. קבוצת $ לסיכום האוכלוסייה הכוללת של כל עיר
  2. קבוצת $ כדי לחשב אוכלוסייה ממוצעת של כל מדינה
  3. $ sort שלב לסדר מדינות לפי אוכלוסיית העיר הממוצעת בסדר עולה
  4. מגבלת $ להשיג את המדינה הראשונה עם אוכלוסיית העיר הממוצעת הנמוכה ביותר

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

GroupOperation sumTotalCityPop = group ("state", "city") .sum ("pop"). As ("cityPop"); GroupOperation averageStatePop = group ("_ id.state") .avg ("cityPop"). As ("avgCityPop"); SortOperation sortByAvgPopAsc = sort (Sort.by (Direction.ASC, "avgCityPop")); LimitOperation limitToOnlyFirstDoc = limit (1); ProjectionOperation projectToMatchModel = project () .andExpression ("_ id"). As ("state") .andExpression ("avgCityPop"). As ("statePop"); צבירת צבירה = newAggregation (sumTotalCityPop, averageStatePop, sortByAvgPopAsc, limitToOnlyFirstDoc, projectToMatchModel); AggregationResults result = mongoTemplate .aggregate (צבירה, "רוכסנים", StatePopulation.class); StatePopulation smallestState = result.getUniqueMappedResult ();

בדוגמה זו, אנו כבר יודעים כי יהיה רק ​​מסמך אחד בתוצאה מכיוון שאנחנו מגבילים את מספר מסמכי הפלט ל -1 בשלב האחרון. ככאלה, אנו יכולים להפעיל getUniqueMappedResult () כדי לקבל את הנדרש אוכלוסיית המדינה למשל.

דבר נוסף שיש לשים לב אליו הוא שבמקום להסתמך על ה- @תְעוּדַת זֶהוּת ביאור למפה _תְעוּדַת זֶהוּת אם נאמר, עשינו זאת במפורש בשלב ההקרנה.

3.3. קבל את המדינה עם מיקודים מקסימליים ומינימום

לדוגמא זו, אנו זקוקים לשלושה שלבים:

  1. קבוצת $ כדי לספור את מספר המיקודים עבור כל מדינה
  2. $ sort להזמין את המדינות לפי מספר המיקודים
  3. קבוצת $ כדי למצוא את המדינה עם מיקודים מקסימליים ודקות באמצעות הראשון $ ו $ האחרון מפעילים
GroupOperation sumZips = group ("state"). Count (). As ("zipCount"); SortOperation sortByCount = sort (Direction.ASC, "zipCount"); GroupOperation groupFirstAndLast = group (). First ("_ id"). As ("minZipState"). First ("zipCount"). As ("minZipCount"). Last ("_ id"). As ("maxZipState"). Last ("zipCount"). כמו ("maxZipCount"); צבירת צבירה = newAggregation (sumZips, sortByCount, groupFirstAndLast); AggregationResults result = mongoTemplate .aggregate (צבירה, "רוכסנים", Document.class); מסמך מסמך = result.getUniqueMappedResult ();

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

4. מסקנה

במאמר זה למדנו כיצד להביא שדות מוגדרים של מסמך ב- MongoDB באמצעות תחזיות ב- Spring Data MongoDB.

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


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