MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

स्प्रिंग डेटा MongoDB में GridFS

1. अवलोकन

यह ट्यूटोरियल स्प्रिंग डेटा MongoDB की मुख्य विशेषताओं में से एक का पता लगाएगा: . के साथ इंटरैक्ट करना ग्रिडएफएस .

GridFS संग्रहण युक्ति मुख्य रूप से BSON . से अधिक फ़ाइलों के साथ काम करने के लिए उपयोग की जाती है -दस्तावेज़ आकार सीमा 16 एमबी। और स्प्रिंग डेटा एक GridFsOperations . प्रदान करता है इंटरफ़ेस और उसका कार्यान्वयन - GridFsTemplate - इस फाइल सिस्टम के साथ आसानी से इंटरैक्ट करने के लिए।

2. विन्यास

2.1. एक्सएमएल विन्यास

आइए GridFsTemplate . के लिए सरल XML कॉन्फ़िगरेशन से प्रारंभ करें :

<bean id="gridFsTemplate" class="org.springframework.data.mongodb.gridfs.GridFsTemplate">
    <constructor-arg ref="mongoDbFactory" />
    <constructor-arg ref="mongoConverter" />
</bean>

GridFsTemplate . के लिए कंस्ट्रक्टर तर्क mongoDbFactory . के लिए बीन संदर्भ शामिल करें , जो एक Mongo डेटाबेस बनाता है, और mongoConverter , जो Java और MongoDB प्रकारों के बीच कनवर्ट करता है। उनकी बीन परिभाषाएँ नीचे हैं।

<mongo:db-factory id="mongoDbFactory" dbname="test" mongo-client-ref="mongoClient" />

<mongo:mapping-converter id="mongoConverter" base-package="com.baeldung.converter">
    <mongo:custom-converters base-package="com.baeldung.converter"/>
</mongo:mapping-converter>

2.2. जावा विन्यास

आइए एक समान कॉन्फ़िगरेशन बनाएं, केवल जावा के साथ:

@Configuration
@EnableMongoRepositories(basePackages = "com.baeldung.repository")
public class MongoConfig extends AbstractMongoClientConfiguration {
    @Autowired
    private MappingMongoConverter mongoConverter;

    @Bean
    public GridFsTemplate gridFsTemplate() throws Exception {
        return new GridFsTemplate(mongoDbFactory(), mongoConverter);
    }
    
    // ...
}

इस कॉन्फ़िगरेशन के लिए, हमने mongoDbFactory() . का उपयोग किया है विधि और MappingMongoConverter . को ऑटो-वायर्ड किया मूल वर्ग में परिभाषित AbstractMongoClientConfiguration

3. ग्रिडएफ टेम्पलेट मुख्य तरीके

3.1. स्टोर

स्टोर विधि फ़ाइल को MongoDB में सहेजती है।

मान लीजिए कि हमारे पास एक खाली डेटाबेस है और उसमें एक फाइल स्टोर करना चाहते हैं:

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

ध्यान दें कि हम DBObject . पास करके फ़ाइल के साथ अतिरिक्त मेटाडेटा सहेज सकते हैं स्टोर . के लिए तरीका। हमारे उदाहरण के लिए, DBObject कुछ इस तरह दिख सकता है:

DBObject metaData = new BasicDBObject();
metaData.put("user", "alex");

ग्रिडएफएस फ़ाइल मेटाडेटा और उसकी सामग्री को संग्रहीत करने के लिए दो संग्रहों का उपयोग करता है। फ़ाइल का मेटाडेटा फ़ाइलों . में संग्रहीत है संग्रह, और फ़ाइल की सामग्री खंडों . में संग्रहीत की जाती है संग्रह। दोनों संग्रहों के पहले 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'].find() फ़ाइल की सामग्री पुनर्प्राप्त करता है:

{
    "_id" : ObjectId("5602de6e5d8bba0d6f2e45e4"),
    "files_id" : ObjectId("5602de6e5d8bba0d6f2e45e4"),
    "n" : 0,
    "data" : 
    { 
        "$binary" : "/9j/4AAQSkZJRgABAQAAAQABAAD/4QAqRXhpZgAASUkqAAgAAAABADEBAgAHAAAAGgAAAAAAAABHb29nbGUAAP/bAIQAAwICAwICAwMDAwQDAwQFCAUFBAQFCgcHBggM
          CgwMCwoLCw0OEhANDhEOCwsQFhARExQVFRUMDxcYFhQYEhQVFAEDBAQGBQUJBgYKDw4MDhQUFA8RDQwMEA0QDA8VDA0NDw0MDw4MDA0ODxAMDQ0MDAwODA8MDQ4NDA0NDAwNDAwQ/8AA
          EQgAHAAcAwERAAIRAQMRAf/EABgAAQEBAQEAAAAAAAAAAAAAAAgGBwUE/8QALBAAAgEDAgQFAwUAAAAAAAAAAQIDBAURBiEABwgSIjFBYXEyUYETFEKhw
          f/EABoBAAIDAQEAAAAAAAAAAAAAAAMEAQIFBgD/xAAiEQACAgEDBAMAAAAAAAAAAAAAAQIRAyIx8BJRYYETIUH/2gAMAwEAAhEDEQA/AHDyq1Bb6GjFPMAszLkZHHCTi1I6O
          cXOFRZ1ZqoX6aqzRClkhb9MGVh2SsNyVI/hjG5389tuGcUaLK1GmFfpn5r3rnXpfV82pGtS3a0XmaGOO3zguKV1SWDwBQDH2uUWTOWMZzuM8bS0VQtJKRb2li9LL3l+4VNQPEfQTOB/WO
          G1K0JtUzwad1eZaYBiqzL4S2N8cZUsa7DqlRGdWvMq5aX6b9Tvb5pIZbggt7VcU3YacSkDbfuLNuu3lkk+98GNfIrLt2gK9K/NWl5Z87Ldebj3R0NTa2tVVKhOI0KoQ5AG4DRqSPk+gHGn
          khUPYNOx92vW9PcrdDW0FUJqOp7po5ETIYMxOdyOAK0qAvcgKPWa0oMTo7SEYDKPp98/5wPoJsx3rZ1wLhojS9iinLD9w9W47iSwVe0Z3wfrPoce2eC4I6rCX9MxrpUpWqudNunUosNLR1EkiyIGDqUKF
          fyZB+AeG80riueQdVfObC/tN1pLdaLfSxMiRQ08aIg2CjtGAB9uEyCSqSWujICUXwghT57A5+ePEoMvUdc5a3XlSsgUhZGjGM/TGAqjz+SfuT7DDmGC6WzzeyOv0+2amOrr3KylzTUwjjDeWGbJJ9/COI
          yvRFFv1iRsVGDaqYGWVsIoBZydsDhQGf/Z", 
        "$type" : "00" 
    }
}

3.2. ढूंढें

ढूंढें ठीक एक दस्तावेज़ देता है जो निर्दिष्ट क्वेरी मानदंड को पूरा करता है।

String id = "5602de6e5d8bba0d6f2e45e4";
GridFSFile gridFsFile = gridFsTemplate.findOne(new Query(Criteria.where("_id").is(id)));

उपरोक्त कोड परिणाम रिकॉर्ड लौटाएगा जो उपरोक्त उदाहरण में जोड़ा गया था। यदि डेटाबेस में एक से अधिक रिकॉर्ड हैं जो क्वेरी से मेल खाते हैं, तो यह केवल एक दस्तावेज़ लौटाएगा। लौटाए गए विशिष्ट रिकॉर्ड को प्राकृतिक क्रम के अनुसार चुना जाएगा (जिस क्रम में दस्तावेज़ डेटाबेस में संग्रहीत किए गए थे)।

3.3. ढूंढें

ढूंढें संग्रह से दस्तावेज़ों का चयन करता है और चयनित दस्तावेज़ों पर एक कर्सर लौटाता है।

मान लीजिए कि हमारे पास निम्नलिखित डेटाबेस है, जिसमें 2 रिकॉर्ड हैं:

[
    {
        "_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"
    },
    {
        "_id" : ObjectId("5702deyu6d8bba0d6f2e45e4"),
        "metadata" : {
            "user" : "david"
        },
        "filename" : "test.png",
        "aliases" : null,
        "chunkSize" : NumberLong(261120),
        "uploadDate" : ISODate("2015-09-23T17:16:30.781Z"),
        "length" : NumberLong(855),
        "contentType" : "image/png",
        "md5" : "27c915db9aa031f1b27bb05021b695c6"
    }
]

अगर हम GridFsTemplate . का उपयोग करते हैं निम्नलिखित क्वेरी निष्पादित करने के लिए:

List<GridFSFile> fileList = new ArrayList<GridFSFile>();
gridFsTemplate.find(new Query()).into(fileList);

परिणामी सूची में दो रिकॉर्ड होने चाहिए क्योंकि हमने कोई मानदंड नहीं दिया है।

बेशक, हम ढूंढने . के लिए कुछ मानदंड प्रदान कर सकते हैं तरीका। उदाहरण के लिए, यदि हम ऐसी फ़ाइलें प्राप्त करना चाहते हैं जिनके मेटाडेटा में alex . नाम वाले उपयोगकर्ता हैं , कोड होगा:

List<GridFSFile> gridFSFiles = new ArrayList<GridFSFile>();
gridFsTemplate.find(new Query(Criteria.where("metadata.user").is("alex"))).into(gridFSFiles);

परिणामी सूची में केवल एक रिकॉर्ड होगा।

3.4. हटाएं

हटाएं संग्रह से दस्तावेज़ हटाता है।

पिछले उदाहरण से डेटाबेस का उपयोग करते हुए, मान लें कि हमारे पास कोड है:

String id = "5702deyu6d8bba0d6f2e45e4";
gridFsTemplate.delete(new Query(Criteria.where("_id").is(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,
    "data" : 
    { 
        "$binary" : "/9j/4AAQSkZJRgABAQAAAQABAAD/4QAqRXhpZgAASUkqAAgAAAABADEBAgAHAAAAGgAAAAAAAABHb29nbGUAAP/bAIQAAwICAwICAwMDAwQDAwQFCAUFBAQFCgcHBggM
          CgwMCwoLCw0OEhANDhEOCwsQFhARExQVFRUMDxcYFhQYEhQVFAEDBAQGBQUJBgYKDw4MDhQUFA8RDQwMEA0QDA8VDA0NDw0MDw4MDA0ODxAMDQ0MDAwODA8MDQ4NDA0NDAwNDAwQ/8AA
          EQgAHAAcAwERAAIRAQMRAf/EABgAAQEBAQEAAAAAAAAAAAAAAAgGBwUE/8QALBAAAgEDAgQFAwUAAAAAAAAAAQIDBAURBiEABwgSIjFBYXEyUYETFEKhw
          f/EABoBAAIDAQEAAAAAAAAAAAAAAAMEAQIFBgD/xAAiEQACAgEDBAMAAAAAAAAAAAAAAQIRAyIx8BJRYYETIUH/2gAMAwEAAhEDEQA/AHDyq1Bb6GjFPMAszLkZHHCTi1I6O
          cXOFRZ1ZqoX6aqzRClkhb9MGVh2SsNyVI/hjG5389tuGcUaLK1GmFfpn5r3rnXpfV82pGtS3a0XmaGOO3zguKV1SWDwBQDH2uUWTOWMZzuM8bS0VQtJKRb2li9LL3l+4VNQPEfQTOB/WO
          G1K0JtUzwad1eZaYBiqzL4S2N8cZUsa7DqlRGdWvMq5aX6b9Tvb5pIZbggt7VcU3YacSkDbfuLNuu3lkk+98GNfIrLt2gK9K/NWl5Z87Ldebj3R0NTa2tVVKhOI0KoQ5AG4DRqSPk+gHGn
          khUPYNOx92vW9PcrdDW0FUJqOp7po5ETIYMxOdyOAK0qAvcgKPWa0oMTo7SEYDKPp98/5wPoJsx3rZ1wLhojS9iinLD9w9W47iSwVe0Z3wfrPoce2eC4I6rCX9MxrpUpWqudNunUosNLR1EkiyIGDqUKF
          fyZB+AeG80riueQdVfObC/tN1pLdaLfSxMiRQ08aIg2CjtGAB9uEyCSqSWujICUXwghT57A5+ePEoMvUdc5a3XlSsgUhZGjGM/TGAqjz+SfuT7DDmGC6WzzeyOv0+2amOrr3KylzTUwjjDeWGbJJ9/COI
          yvRFFv1iRsVGDaqYGWVsIoBZydsDhQGf/Z", 
        "$type" : "00" 
    }
}

3.5. संसाधन प्राप्त करें

संसाधन प्राप्त करें सभी GridFsResource . लौटाता है दिए गए फ़ाइल नाम पैटर्न के साथ।

मान लीजिए हमारे पास डेटाबेस में निम्नलिखित रिकॉर्ड हैं:

[
   {
       "_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"
   },
   {
       "_id" : ObjectId("5505de6e5d8bba0d6f8e4574"),
       "metadata" : {
           "user" : "david"
       },
       "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("5777de6e5d8bba0d6f8e4574"),
       "metadata" : {
           "user" : "eugen"
       },
       "filename" : "baeldung.png",
       "aliases" : null,
       "chunkSize" : NumberLong(261120),
       "uploadDate" : ISODate("2015-09-23T17:16:30.781Z"),
       "length" : NumberLong(855),
       "contentType" : "image/png",
       "md5" : "27c915db9aa031f1b27bb05021b695c6"
    }
]

अब getResources execute निष्पादित करते हैं फ़ाइल पैटर्न का उपयोग करना:

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

यह उन दो अभिलेखों को लौटा देगा जिनके फ़ाइल नाम "परीक्षण" से शुरू होते हैं (इस मामले में, वे दोनों नाम test.png हैं )।

4. ग्रिडएफएसफाइल मुख्य तरीके

ग्रिडएफएसफाइल एपीआई भी काफी सरल है:

  • फाइलनाम प्राप्त करें - फ़ाइल का फ़ाइल नाम प्राप्त करता है
  • मेटाडेटा प्राप्त करें - दी गई फ़ाइल के लिए मेटाडेटा प्राप्त करता है
  • इसमें फ़ील्ड शामिल है - निर्धारित करता है कि दस्तावेज़ में दिए गए नाम के साथ कोई फ़ील्ड है या नहीं
  • प्राप्त करें - ऑब्जेक्ट से नाम से एक फ़ील्ड प्राप्त करता है
  • getId - फ़ाइल का ऑब्जेक्ट आईडी प्राप्त करता है
  • कीसेट - वस्तु के क्षेत्र के नाम प्राप्त करता है

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. मोंगो शेल में रहते हुए फ़ाइल में मोंगो क्वेरी आउटपुट प्रिंट करना

  2. मोंगोडीबी $stdDevSamp

  3. मैं मोंगो कंसोल में ऑब्जेक्ट आईडी द्वारा ऑब्जेक्ट की खोज कैसे करूं?

  4. दस्तावेज़ों के लिए क्वेरी जहां सरणी का आकार 1 . से बड़ा है

  5. MongoDB BSON दस्तावेज़ आकार सीमा को समझना