מבוא ל- Data Data MongoDB

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

מאמר זה יהיה מהיר ופרקטי מבוא ל- Spring Data MongoDB.

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

2. MongoTemplateו- MongoRepository

ה MongoTemplateעוקב אחר תבנית התבנית הסטנדרטית באביב ומספק ממשק API בסיסי מוכן לשימוש למנוע ההתמדה הבסיסי.

המאגר עוקב אחר הגישה ממוקדת Spring Data ומגיע עם פעולות API גמישות ומורכבות יותר, המבוססות על דפוסי הגישה הידועים בכל פרויקטי Spring Data.

עבור שניהם, עלינו להתחיל בהגדרת התלות - למשל ב pom.xml, עם מייבן:

 org.springframework.data spring-data-mongodb 3.0.3.RELEASE 

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

3. תצורה עבור MongoTemplate

3.1. תצורת XML

נתחיל בתצורת ה- XML ​​הפשוטה עבור תבנית Mongo:

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

לאחר מכן - עלינו להגדיר (ולהגדיר) את שעועית התבנית:

ולבסוף, עלינו להגדיר מעבד פוסט לתרגום של כל אחד מהם MongoExceptions נזרק פנימה מאגר @ שיעורים ביאורים:

3.2. תצורת Java

בואו ניצור תצורה דומה באמצעות Java config על ידי הרחבת מחלקת הבסיס לתצורת MongoDB תקציר MongoConfiguration:

@Configuration מחלקה ציבורית MongoConfig מרחיב את AbstractMongoClientConfiguration {@Override מוגן מחרוזת getDatabaseName () {להחזיר "מבחן"; } @Override ציבור MongoClient mongoClient () {ConnectionString connectionString = ConnectionString חדש ("mongodb: // localhost: 27017 / test"); MongoClientSettings mongoClientSettings = MongoClientSettings.builder () .applyConnectionString (connectionString) .build (); החזירו את MongoClients.create (mongoClientSettings); } @Override אוסף ציבורי getMappingBasePackages () {החזר Collections.singleton ("com.baeldung"); }}

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

אנו יכולים גם להשתמש בתצורה שלנו מאפס מבלי להאריך אותה תקציר MongoClientConfiguration - כדלהלן:

@Configuration class class SimpleMongoConfig {@Bean public MongoClient mongo () {ConnectionString connectionString = ConnectionString new ("mongodb: // localhost: 27017 / test"); MongoClientSettings mongoClientSettings = MongoClientSettings.builder () .applyConnectionString (connectionString) .build (); החזירו את MongoClients.create (mongoClientSettings); } @Bean הציבור MongoTemplate mongoTemplate () זורק חריג {להחזיר MongoTemplate חדש (mongo (), "מבחן"); }}

4. תצורה עבור מאגר מאגר

4.1. תצורת XML

כדי להשתמש במאגרים מותאמים אישית (הרחבת ה- מאגר מאגר) - עלינו להמשיך בתצורה מסעיף 3.1 ולהגדיר את המאגרים:

4.2. תצורת Java

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

@EnableMongoRepositories (basePackages = "com.baeldung.repository") 

4.3. צור את המאגר

כעת, לאחר התצורה, עלינו ליצור מאגר - להרחיב את הקיים מאגר מאגר מִמְשָׁק:

ממשק ציבורי UserRepository מרחיב את MongoRepository {//}

עכשיו אנחנו יכולים לחבר את זה אוטומטית UserRepository ולהשתמש בפעולות מ מאגר מאגר או הוסף פעולות מותאמות אישית.

5. שימוש MongoTemplate

5.1. לְהַכנִיס

נתחיל בפעולת ההכנסה; נתחיל גם במסד נתונים ריק:

{ }

עכשיו אם נכניס משתמש חדש:

משתמש משתמש = משתמש חדש (); user.setName ("ג'ון"); mongoTemplate.insert (משתמש, "משתמש");

מסד הנתונים ייראה כך:

{"_id": ObjectId ("55b4fda5830b550a8c2ca25a"), "_class": "com.baeldung.model.User", "name": "Jon"}

5.2. שמור - הכנס

ה לשמור לפעולה יש סמנטיקה של שמירה או עדכון: אם מזהה קיים, הוא מבצע עדכון, אם לא - הוא מכניס.

בואו נסתכל על הסמנטיקה הראשונה - ההוספה; הנה המצב הראשוני של מסד הנתונים:

{ }

כשאנחנו עכשיו לשמור משתמש חדש:

משתמש משתמש = משתמש חדש (); user.setName ("אלברט"); mongoTemplate.save (משתמש, "משתמש");

היישות תוכנס למסד הנתונים:

{"_id": ObjectId ("55b52bb7830b8c9b544b6ad5"), "_class": "com.baeldung.model.User", "name": "Albert"}

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

5.3. שמור - עדכן

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

{"_id": ObjectId ("55b52bb7830b8c9b544b6ad5"), "_class": "com.baeldung.model.User", "name": "Jack"}

עכשיו, כשאנחנו לשמור המשתמש הקיים - נעדכן אותו:

user = mongoTemplate.findOne (Query.query (Criteria.where ("name"). is ("Jack")), User.class); user.setName ("ג'ים"); mongoTemplate.save (משתמש, "משתמש");

מסד הנתונים ייראה כך:

{"_id": ObjectId ("55b52bb7830b8c9b544b6ad5"), "_class": "com.baeldung.model.User", "name": "Jim"}

כפי שאתה יכול לראות, בדוגמה הספציפית הזו, לשמור משתמש בסמנטיקה של עדכון, כי אנו משתמשים באובייקט עם נתון _תְעוּדַת זֶהוּת.

5.4. UpdateFirst

updateFirst מעדכן את המסמך הראשון שתואם את השאילתה.

נתחיל עם המצב הראשוני של מסד הנתונים:

[{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Alex"}, {"_id": ObjectId ("55b5ffa5511fee0e45ed614c"), "_class ":" com.baeldung.model.User "," name ":" Alex "}]

כאשר אנו מנהלים כעת את updateFirst:

שאילתת שאילתות = שאילתה חדשה (); query.addCriteria (Criteria.where ("שם"). הוא ("אלכס")); עדכון עדכון = עדכון חדש (); update.set ("שם", "ג'יימס"); mongoTemplate.updateFirst (שאילתה, עדכון, User.class);

רק הערך הראשון יעודכן:

[{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "James"}, {"_id": ObjectId ("55b5ffa5511fee0e45ed614c"), "_class ":" com.baeldung.model.User "," name ":" Alex "}]

5.5. UpdateMulti

UpdateMultiמעדכן את כל המסמכים התואמים לשאילתה הנתונה.

ראשית - הנה מצב מסד הנתונים לפני ביצוע ה- updateMulti:

[{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Eugen"}, {"_id": ObjectId ("55b5ffa5511fee0e45ed614c"), "_class ":" com.baeldung.model.User "," name ":" Eugen "}] 

עכשיו, בוא עכשיו ננהל את updateMulti מבצע:

שאילתת שאילתות = שאילתה חדשה (); query.addCriteria (Criteria.where ("שם"). הוא ("Eugen")); עדכון עדכון = עדכון חדש (); update.set ("שם", "ויקטור"); mongoTemplate.updateMulti (שאילתה, עדכון, User.class);

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

[{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Victor"}, {"_id": ObjectId ("55b5ffa5511fee0e45ed614c"), "_class ":" com.baeldung.model.User "," name ":" Victor "}]

5.6. FindAndModify

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

ראשית - מצב מסד הנתונים לפני התקשרות findAndModify:

{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Markus"} 

בואו נסתכל על קוד הפעולה בפועל:

שאילתת שאילתות = שאילתה חדשה (); query.addCriteria (Criteria.where ("שם"). הוא ("Markus")); עדכון עדכון = עדכון חדש (); update.set ("שם", "ניק"); משתמש משתמש = mongoTemplate.findAndModify (שאילתה, עדכון, User.class);

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

עם זאת, המצב החדש במסד הנתונים הוא:

{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Nick"}

5.7. מעלה

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

נתחיל עם המצב הראשוני של מסד הנתונים:

{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Markus"}

עכשיו - בואו ננהל את עלייה:

שאילתת שאילתות = שאילתה חדשה (); query.addCriteria (Criteria.where ("שם"). הוא ("Markus")); עדכון עדכון = עדכון חדש (); update.set ("שם", "ניק"); mongoTemplate.upsert (שאילתה, עדכון, User.class);

הנה מצב מסד הנתונים לאחר הפעולה:

{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Nick"}

5.8. לְהַסִיר

מצב מסד הנתונים לפני התקשרות לְהַסִיר:

{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Benn"}

בואו נעבור עכשיו לְהַסִיר:

mongoTemplate.remove (משתמש, "משתמש");

התוצאה תהיה כצפוי:

{ }

6. שימוש מאגר מאגר

6.1. לְהַכנִיס

ראשית - מצב מסד הנתונים לפני הפעלת ה- לְהַכנִיס:

{ }

כעת, כאשר אנו מכניסים משתמש חדש:

משתמש משתמש = משתמש חדש (); user.setName ("ג'ון"); userRepository.insert (משתמש); 

הנה המצב הסופי של מסד הנתונים:

{"_id": ObjectId ("55b4fda5830b550a8c2ca25a"), "_class": "com.baeldung.model.User", "name": "Jon"}

שים לב כיצד הפעולה פועלת זהה ל- לְהַכנִיס בתוך ה MongoTemplate ממשק API.

6.2. להציל לְהַכנִיס

בדומה לכך - לשמור עובד זהה ל לשמור מבצע ב MongoTemplate ממשק API.

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

{ }

עכשיו - אנחנו מבצעים את לשמור מבצע:

משתמש משתמש = משתמש חדש (); user.setName ("אהרון"); userRepository.save (user);

כתוצאה מכך המשתמש מתווסף למסד הנתונים:

{"_id": ObjectId ("55b52bb7830b8c9b544b6ad5"), "_class": "com.baeldung.model.User", "name": "Aaron"}

שים לב שוב כיצד, בדוגמה זו, לשמור עובד עם לְהַכנִיס סמנטיקה, כי אנחנו מכניסים אובייקט חדש.

6.3. להציל עדכון

בואו נסתכל על אותה פעולה אך עם עדכן סמנטיקה.

ראשית - הנה מצב מסד הנתונים לפני הפעלת החדש לשמור:

{"_id": ObjectId ("55b52bb7830b8c9b544b6ad5"), "_class": "com.baeldung.model.User", "name": "Jack" 81 * 6}

עכשיו - אנו מבצעים את הפעולה:

user = mongoTemplate.findOne (Query.query (Criteria.where ("name"). is ("Jack")), User.class); user.setName ("ג'ים"); userRepository.save (user);

לבסוף, הנה מצב מסד הנתונים:

{"_id": ObjectId ("55b52bb7830b8c9b544b6ad5"), "_class": "com.baeldung.model.User", "name": "Jim"}

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

6.4. לִמְחוֹק

מצב מסד הנתונים לפני התקשרות לִמְחוֹק:

{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Benn"}

בוא נרוץ לִמְחוֹק:

userRepository.delete (משתמש); 

התוצאה תהיה פשוט:

{ }

6.5. FindOne

מצב מסד הנתונים מתי findOne נקרא:

{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Chris"}

בוא נבצע כעת את findOne:

userRepository.findOne (user.getId ()) 

התוצאה שתחזיר את הנתונים הקיימים:

{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Chris"}

6.6. קיים

מצב מסד הנתונים לפני התקשרות קיים:

{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Harris"}

עכשיו, בואו נרוץ קיים:

isExists בוליאני = userRepository.exists (user.getId ());

מה שכמובן יחזור נָכוֹן.

6.7. מצא את כל W. ith סוג

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

[{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Brendan"}, {"_id": ObjectId ("67b5ffa5511fee0e45ed614b"), "_class ":" com.baeldung.model.User "," name ":" אדם "}]

בואו עכשיו נרוץ מצא הכל עם סוג:

משתמשים ברשימה = userRepository.findAll (Sort.by (Sort.Direction.ASC, "שם"));

התוצאה תהיה ממוינים לפי שם בסדר עולה:

[{"_id": ObjectId ("67b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Adam"}, {"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class ":" com.baeldung.model.User "," name ":" Brendan "}]

6.8. מצא את כל W. ith תומכי

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

[{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Brendan"}, {"_id": ObjectId ("67b5ffa5511fee0e45ed614b"), "_class ":" com.baeldung.model.User "," name ":" אדם "}]

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

Pageable pageableRequest = PageRequest.of (0, 1); דף עמוד = userRepository.findAll (pageableRequest); משתמשים ברשימה = pages.getContent ();

כתוצאה מכך משתמשים הרשימה תהיה רק ​​משתמש אחד:

{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Brendan"}

7. ביאורים

לבסוף, בואו נעבור גם על ההערות הפשוטות שמשתמשים ב- Spring Data בכדי להניע פעולות API אלה.

מזהה מחרוזת פרטי @Id;

מפלס השדה @תְעוּדַת זֶהוּת ביאור יכול לקשט כל סוג, כולל ארוך ו חוּט.

אם הערך של @תְעוּדַת זֶהוּת השדה אינו ריק, הוא מאוחסן במסד הנתונים כפי שהוא; אחרת, הממיר יניח שאתה רוצה לאחסן ObjectId במסד הנתונים (או ObjectId, מחרוזת אוֹ ביג-שלם עֲבוֹדָה).

הבא - @מסמך:

משתמש בכיתה ציבורית @Document {//}

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

8. מסקנה

מאמר זה היה מבוא מהיר אך מקיף לשימוש ב- MongoDB עם Spring Data, הן באמצעות ה- MongoTemplate ממשק API וכן שימוש ב- מאגר מאגר.

יישום כל הדוגמאות וקטעי הקוד יכול להמצא על גיתוב.