GridFS ב- Spring Data MongoDB

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

מדריך זה יחקור את אחד מה- מאפייני הליבה של Spring Data MongoDB: אינטראקציה עם GridFS.

מפרט האחסון של GridFS משמש בעיקר לעבודה עם קבצים העולים על ה- BSON- מגבלת גודל המסמך היא 16MB. ונתוני האביב מספקים GridFsOperations ממשק ויישומו - תבנית GridFs - לתקשר בקלות עם מערכת קבצים זו.

2. תצורה

2.1. תצורת XML

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

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

2.2. תצורת Java

בואו ניצור תצורה דומה, רק עם Java:

@Configuration @EnableMongoRepositories (basePackages = "com.baeldung.repository") מעמד ציבורי MongoConfig מרחיב את AbstractMongoClientConfiguration {@Awired פרטי MappingMongoConverter mongoConverter; @Bean GridFsTemplate ציבורי gridFsTemplate () זורק חריג {להחזיר GridFsTemplate חדש (mongoDbFactory (), mongoConverter); } // ...}

עבור תצורה זו, השתמשנו ב- mongoDbFactory () שיטה וחיווט אוטומטית את ה- MappingMongoConverter מוגדר בכיתת ההורים תקציר MongoClientConfiguration.

3. GridFsTemplate שיטות הליבה

3.1. חנות

ה חנות השיטה שומרת קובץ ב- MongoDB.

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

InputStream inputStream = FileInputStream חדש ("src / main / resources / test.png"); gridFsTemplate.store (inputStream, "test.png", "image / png", metaData) .toString ();

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

DBObject metaData = חדש BasicDBObject (); metaData.put ("משתמש", "אלכס");

GridFS משתמש בשני אוספים כדי לאחסן את מטא הנתונים של הקובץ ואת תוכנו. המטה-נתונים של הקובץ מאוחסנים ב- קבצים אוסף, ותוכן הקובץ מאוחסן ב- נתחים אוסף. שתי האוספים מוקדמות עם fs.

אם נבצע את הפקודה MongoDB db ['fs.files']. find (), נראה את fs.files אוסף:

{"_id": ObjectId ("5602de6e5d8bba0d6f2e45e4"), "metadata": {"user": "alex"}, "filename": "test.png", "aliases": null, "chunkSize": NumberLong (261120) , "uploadDate": ISODate ("2015-09-23T17: 16: 30.781Z"), "length": NumberLong (855), "contentType": "image / png", "md5": "27c915db9aa031f1b27bb05021b695c6"}

הפקודה db ['fs.chunks']. מצא () מאחזר את תוכן הקובץ:

{ "_ Id": ObjectId ( "5602de6e5d8bba0d6f2e45e4"), "files_id": ObjectId ( "5602de6e5d8bba0d6f2e45e4"), "n": 0, "נתונים": { "$ בינארית": "/ 9J / 4AAQSkZJRgABAQAAAQABAAD / 4QAqRXhpZgAASUkqAAgAAAABADEBAgAHAAAAGgAAAAAAAABHb29nbGUAAP / bAIQAAwICAwICAwMDAwQDAwQFCAUFBAQFCgcHBggM CgwMCwoLCw0OEhANDhEOCwsQFhARExQVFRUMDxcYFhQYEhQVFAEDBAQGBQUJBgYKDw4MDhQUFA8RDQwMEA0QDA8VDA0NDw0MDw4MDA0ODxAMDQ0MDAwODA8MDQ4NDA0NDAwNDAwQ / 8AA EQgAHAAcAwERAAIRAQMRAf / EABgAAQEBAQEAAAAAAAAAAAAAAAgGBwUE / 8QALBAAAgEDAgQFAwUAAAAAAAAAAQIDBAURBiEABwgSIjFBYXEyUYETFEKhw f / EABoBAAIDAQEAAAAAAAAAAAAAAAMEAQIFBgD / xAAiEQACAgEDBAMAAAAAAAAAAAAAAQIRAyIx8BJRYYETIUH / 2gAMAwEAAhEDEQA / AHDyq1Bb6GjFPMAszLkZHHCTi1I6O cXOFRZ1ZqoX6aqzRClkhb9MGVh2SsNyVI / hjG5389tuGcUaLK1GmFfpn5r3rnXpfV82pGtS3a0XmaGOO3zguKV1SWDwBQDH2uUWTOWMZzuM8bS0VQtJKRb2li9LL3l + 4VNQPEfQTOB / WO G1K0JtUzwad1eZaYBiqzL4S2N8cZUsa7DqlRGdWvMq5aX6b9Tvb5pIZbggt7VcU3YacSkDbfuLNuu3lkk + 98GNfIrLt2gK9K / NWl5Z87Ldebj3R0NTa2tVVKhOI0KoQ5AG4DRqSPk + gHGn khUPYNOx92vW9PcrdDW0FUJqOp7po5ETIYMxOdyOAK0qAvcgKPWa0oMTo7SEYD KPp98 / 5wPoJsx3rZ1wLhojS9iinLD9w9W47iSwVe0Z3wfrPoce2eC4I6rCX9MxrpUpWqudNunUosNLR1EkiyIGDqUKF fyZB + AeG80riueQdVfObC / tN1pLdaLfSxMiRQ08aIg2CjtGAB9uEyCSqSWujICUXwghT57A5 + ePEoMvUdc5a3XlSsgUhZGjGM / TGAqjz + SfuT7DDmGC6WzzeyOv0 + 2amOrr3KylzTUwjjDeWGbJJ9 / COI yvRFFv1iRsVGDaqYGWVsIoBZydsDhQGf / Z", "$ type": "00"}}

3.2. findOne

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

מחרוזת id = "5602de6e5d8bba0d6f2e45e4"; GridFSFile gridFsFile = gridFsTemplate.findOne (שאילתה חדשה (Criteria.where ("_ id"). היא (id))); 

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

3.3. למצוא

למצוא בוחר מסמכים מאוסף ומחזיר סמן למסמכים שנבחרו.

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

[{"_id": ObjectId ("5602de6e5d8bba0d6f2e45e4"), "metadata": {"user": "alex"}, "filename": "test.png", "aliases": null, "chunkSize": NumberLong (261120 ), "uploadDate": ISODate ("23-09-2013T17: 16: 30.781Z"), "length": NumberLong (855), "contentType": "image / png", "md5": "27c915db9aa031f1b27bb05021b695c6"}, {"_id": ObjectId ("5702deyu6d8bba0d6f2e45e4"), "metadata": {"user": "david"}, "filename": "test.png", "aliases": null, "chunkSize": NumberLong (261120) , "uploadDate": ISODate ("23-09-2013T17: 16: 30.781Z"), "אורך": NumberLong (855), "contentType": "image / png", "md5": "27c915db9aa031f1b27bb05021b695c6"}]

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

רשימת fileList = ArrayList חדש (); gridFsTemplate.find (שאילתה חדשה ()). לתוך (fileList);

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

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

רשימת gridFSFiles = ArrayList חדש (); gridFsTemplate.find (שאילתה חדשה (Criteria.where ("metadata.user"). הוא ("אלכס"))). לתוך (gridFSFiles);

הרשימה המתקבלת תכלול רק רשומה אחת.

3.4. לִמְחוֹק

לִמְחוֹק מסיר מסמכים מאוסף.

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

מחרוזת id = "5702deyu6d8bba0d6f2e45e4"; gridFsTemplate.delete (שאילתה חדשה (Criteria.where ("_ id"). היא (id))); 

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

{"_id": ObjectId ("5702deyu6d8bba0d6f2e45e4"), "metadata": {"user": "alex"}, "filename": "test.png", "aliases": null, "chunkSize": NumberLong (261120) , "uploadDate": ISODate ("2015-09-23T17: 16: 30.781Z"), "length": NumberLong (855), "contentType": "image / png", "md5": "27c915db9aa031f1b27bb05021b695c6"}

עם נתחים:

{ "_ Id": ObjectId ( "5702deyu6d8bba0d6f2e45e4"), "files_id": ObjectId ( "5702deyu6d8bba0d6f2e45e4"), "n": 0, "נתונים": { "$ בינארית": "/ 9J / 4AAQSkZJRgABAQAAAQABAAD / 4QAqRXhpZgAASUkqAAgAAAABADEBAgAHAAAAGgAAAAAAAABHb29nbGUAAP / bAIQAAwICAwICAwMDAwQDAwQFCAUFBAQFCgcHBggM CgwMCwoLCw0OEhANDhEOCwsQFhARExQVFRUMDxcYFhQYEhQVFAEDBAQGBQUJBgYKDw4MDhQUFA8RDQwMEA0QDA8VDA0NDw0MDw4MDA0ODxAMDQ0MDAwODA8MDQ4NDA0NDAwNDAwQ / 8AA EQgAHAAcAwERAAIRAQMRAf / EABgAAQEBAQEAAAAAAAAAAAAAAAgGBwUE / 8QALBAAAgEDAgQFAwUAAAAAAAAAAQIDBAURBiEABwgSIjFBYXEyUYETFEKhw f / EABoBAAIDAQEAAAAAAAAAAAAAAAMEAQIFBgD / xAAiEQACAgEDBAMAAAAAAAAAAAAAAQIRAyIx8BJRYYETIUH / 2gAMAwEAAhEDEQA / AHDyq1Bb6GjFPMAszLkZHHCTi1I6O cXOFRZ1ZqoX6aqzRClkhb9MGVh2SsNyVI / hjG5389tuGcUaLK1GmFfpn5r3rnXpfV82pGtS3a0XmaGOO3zguKV1SWDwBQDH2uUWTOWMZzuM8bS0VQtJKRb2li9LL3l + 4VNQPEfQTOB / WO G1K0JtUzwad1eZaYBiqzL4S2N8cZUsa7DqlRGdWvMq5aX6b9Tvb5pIZbggt7VcU3YacSkDbfuLNuu3lkk + 98GNfIrLt2gK9K / NWl5Z87Ldebj3R0NTa2tVVKhOI0KoQ5AG4DRqSPk + gHGn khUPYNOx92vW9PcrdDW0FUJqOp7po5ETIYMxOdyOAK0qAvcgKPWa0oMTo7SEYD KPp98 / 5wPoJsx3rZ1wLhojS9iinLD9w9W47iSwVe0Z3wfrPoce2eC4I6rCX9MxrpUpWqudNunUosNLR1EkiyIGDqUKF fyZB + AeG80riueQdVfObC / tN1pLdaLfSxMiRQ08aIg2CjtGAB9uEyCSqSWujICUXwghT57A5 + ePEoMvUdc5a3XlSsgUhZGjGM / TGAqjz + SfuT7DDmGC6WzzeyOv0 + 2amOrr3KylzTUwjjDeWGbJJ9 / COI yvRFFv1iRsVGDaqYGWVsIoBZydsDhQGf / Z", "$ type": "00"}}

3.5. getResources

getResources מחזיר הכל GridFsResource עם דפוס שם הקובץ הנתון.

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

[{"_id": ObjectId ("5602de6e5d8bba0d6f2e45e4"), "metadata": {"user": "alex"}, "filename": "test.png", "aliases": null, "chunkSize": NumberLong (261120 ), "uploadDate": ISODate ("23-09-2013T17: 16: 30.781Z"), "length": NumberLong (855), "contentType": "image / png", "md5": "27c915db9aa031f1b27bb05021b695c6"}, {"_id": ObjectId ("5505de6e5d8bba0d6f8e4574"), "metadata": {"user": "david"}, "filename": "test.png", "aliases": null, "chunkSize": NumberLong (261120) , "uploadDate": ISODate ("23-09-2013T17: 16: 30.781Z"), "אורך": NumberLong (855), "contentType": "image / png", "md5": "27c915db9aa031f1b27bb05021b695c6"}, { "_id": ObjectId ("5777de6e5d8bba0d6f8e4574"), "metadata": {"user": "eugen"}, "filename": "baeldung.png", "aliases": null, "chunkSize": NumberLong (261120), "uploadDate": ISODate ("23-09 2015T17: 16: 30.781Z"), "אורך": NumberLong (855), "contentType": "image / png", "md5": "27c915db9aa031f1b27bb05021b695c6"}
]

עכשיו בוא נבצע getResources באמצעות תבנית קובץ:

GridFsResource [] gridFsResource = gridFsTemplate.getResources ("test *");

פעולה זו תחזיר את שתי הרשומות ששמות הקבצים שלהן מתחילים ב"מבחן "(במקרה זה, שניהם נקראים test.png).

4. GridFSFile שיטות הליבה

ה GridFSFile ממשק API פשוט למדי:

  • getFilename - מקבל את שם הקובץ של הקובץ
  • getMetaData - מקבל את המטא נתונים עבור הקובץ הנתון
  • containField - קובע אם המסמך מכיל שדה עם השם הנתון
  • לקבל - מקבל שדה מהאובייקט בשם
  • getId - מקבל את מזהה האובייקט של הקובץ
  • סט מפתחות - מקבל את שמות השדות של האובייקט

5. מסקנה

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

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


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