1. अवलोकन
स्प्रिंग डेटा MongoDB का उपयोग करते समय, हमें डेटाबेस ऑब्जेक्ट से मैप किए गए गुणों को प्रतिबंधित करने की आवश्यकता हो सकती है। आमतौर पर, हमें इसकी आवश्यकता हो सकती है, उदाहरण के लिए, सुरक्षा कारणों से - सर्वर पर संग्रहीत संवेदनशील जानकारी को उजागर करने से बचने के लिए। या, उदाहरण के लिए, हमें वेब एप्लिकेशन में प्रदर्शित डेटा के हिस्से को फ़िल्टर करने की आवश्यकता हो सकती है।
इस संक्षिप्त ट्यूटोरियल में, हम देखेंगे कि कैसे MongoDB फ़ील्ड प्रतिबंध लागू करता है।
2. प्रोजेक्शन का उपयोग करके MongoDB फ़ील्ड प्रतिबंध
MongoDB किसी क्वेरी से लौटने के लिए फ़ील्ड निर्दिष्ट या प्रतिबंधित करने के लिए प्रोजेक्शन का उपयोग करता है . हालांकि, अगर हम स्प्रिंग डेटा का उपयोग कर रहे हैं, तो हम इसे MongoTemplate . के साथ लागू करना चाहते हैं या मोंगो रिपोजिटरी ।
इसलिए, हम MongoTemplate . दोनों के लिए टेस्ट केस बनाना चाहते हैं और मोंगो रिपोजिटरी जहां हम फील्ड प्रतिबंध लागू कर सकते हैं।
3. प्रोजेक्शन लागू करना
3.1. इकाई की स्थापना
सबसे पहले, आइए एक इन्वेंट्री बनाएं कक्षा:
@Document(collection = "inventory")
public class Inventory {
@Id
private String id;
private String status;
private Size size;
private InStock inStock;
// standard getters and setters
}
3.2. रिपोजिटरी सेट करना
फिर, MongoRepository . का परीक्षण करने के लिए , हम एक इन्वेंटरी रिपोजिटरी . बनाते हैं . हम एक कहां . का भी उपयोग करेंगे @Query . के साथ शर्त . उदाहरण के लिए, हम इन्वेंट्री स्थिति के लिए फ़िल्टर करना चाहते हैं:
public interface InventoryRepository extends MongoRepository<Inventory, String> {
@Query(value = "{ 'status' : ?0 }", fields = "{ 'item' : 1, 'status' : 1 }")
List<Inventory> findByStatusIncludeItemAndStatusFields(String status);
@Query(value = "{ 'status' : ?0 }", fields = "{ 'item' : 1, 'status' : 1, '_id' : 0 }")
List<Inventory> findByStatusIncludeItemAndStatusExcludeIdFields(String status);
@Query(value = "{ 'status' : ?0 }", fields = "{ 'status' : 0, 'inStock' : 0 }")
List<Inventory> findByStatusIncludeAllButStatusAndStockFields(String status);
@Query(value = "{ 'status' : ?0 }", fields = "{ 'item' : 1, 'status' : 1, 'size.uom': 1 }")
List<Inventory> findByStatusIncludeEmbeddedFields(String status);
@Query(value = "{ 'status' : ?0 }", fields = "{ 'size.uom': 0 }")
List<Inventory> findByStatusExcludeEmbeddedFields(String status);
@Query(value = "{ 'status' : ?0 }", fields = "{ 'item' : 1, 'status' : 1, 'inStock.quantity': 1 }")
List<Inventory> findByStatusIncludeEmbeddedFieldsInArray(String status);
@Query(value = "{ 'status' : ?0 }", fields = "{ 'item' : 1, 'status' : 1, 'inStock': { $slice: -1 } }")
List<Inventory> findByStatusIncludeEmbeddedFieldsLastElementInArray(String status);
}
3.3. मावेन निर्भरता जोड़ना
हम एंबेडेड MongoDB का भी उपयोग करेंगे। आइए जोड़ें वसंत-डेटा-मोंगोडब और de.flapdoodle.embed.mongo हमारे pom.xml . पर निर्भरता फ़ाइल:
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>3.0.3.RELEASE</version>
</dependency>
<dependency>
<groupId>de.flapdoodle.embed</groupId>
<artifactId>de.flapdoodle.embed.mongo</artifactId>
<version>3.2.6</version>
<scope>test</scope>
</dependency>
4. MongoRepository . का उपयोग करके परीक्षण करें और मोंगोटेम्पलेट
MongoRepository . के लिए , हम @Query . का उपयोग करके उदाहरण देखेंगे और क्षेत्र प्रतिबंध लागू करना, जबकि MongoTemplate . के लिए , हम उपयोग करेंगे क्वेरी वर्ग.
हम शामिल और बहिष्कृत के सभी विभिन्न संयोजनों को शामिल करने का प्रयास करेंगे। विशेष रूप से, हम देखेंगे कि एम्बेडेड फ़ील्ड्स को कैसे प्रतिबंधित किया जाए या अधिक दिलचस्प रूप से, स्लाइस का उपयोग करके सरणियों को कैसे प्रतिबंधित किया जाए संपत्ति ।
प्रत्येक परीक्षण के लिए, हम MongoRepository . जोड़ देंगे उदाहरण पहले, उसके बाद MongoTemplate . के लिए उदाहरण ।
4.1. केवल फ़ील्ड शामिल करें
आइए कुछ क्षेत्रों को शामिल करके प्रारंभ करें। सभी बहिष्कृत शून्य होंगे . प्रक्षेपण _id . जोड़ता है डिफ़ॉल्ट रूप से:
List<Inventory> inventoryList = inventoryRepository.findByStatusIncludeItemAndStatusFields("A");
inventoryList.forEach(i -> {
assertNotNull(i.getId());
assertNotNull(i.getItem());
assertNotNull(i.getStatus());
assertNull(i.getSize());
assertNull(i.getInStock());
});
अब, आइए MongoTemplate देखें संस्करण:
Query query = new Query();
query.fields()
.include("item")
.include("status");
4.2. फ़ील्ड शामिल करें और निकालें
इस बार, हम ऐसे उदाहरण देखेंगे जिनमें स्पष्ट रूप से कुछ फ़ील्ड शामिल हैं लेकिन अन्य शामिल नहीं हैं - इस मामले में, हम _id को बाहर कर देंगे फ़ील्ड:
List<Inventory> inventoryList = inventoryRepository.findByStatusIncludeItemAndStatusExcludeIdFields("A");
inventoryList.forEach(i -> {
assertNotNull(i.getItem());
assertNotNull(i.getStatus());
assertNull(i.getId());
assertNull(i.getSize());
assertNull(i.getInStock());
});
MongoTemplate . का उपयोग कर समकक्ष क्वेरी होगा:
Query query = new Query();
query.fields()
.include("item")
.include("status")
.exclude("_id");
4.3. केवल फ़ील्ड बहिष्कृत करें
आइए कुछ क्षेत्रों को छोड़कर जारी रखें। अन्य सभी फ़ील्ड गैर-शून्य होंगे:
List<Inventory> inventoryList = inventoryRepository.findByStatusIncludeAllButStatusAndStockFields("A");
inventoryList.forEach(i -> {
assertNotNull(i.getItem());
assertNotNull(i.getId());
assertNotNull(i.getSize());
assertNull(i.getInStock());
assertNull(i.getStatus());
});
और, आइए देखें MongoTemplate संस्करण:
Query query = new Query();
query.fields()
.exclude("status")
.exclude("inStock");
4.4. एम्बेड किए गए फ़ील्ड शामिल करें
फिर से, एम्बेडेड फ़ील्ड सहित उन्हें हमारे परिणाम में जोड़ दिया जाएगा:
List<Inventory> inventoryList = inventoryRepository.findByStatusIncludeEmbeddedFields("A");
inventoryList.forEach(i -> {
assertNotNull(i.getItem());
assertNotNull(i.getStatus());
assertNotNull(i.getId());
assertNotNull(i.getSize());
assertNotNull(i.getSize().getUom());
assertNull(i.getSize().getHeight());
assertNull(i.getSize().getWidth());
assertNull(i.getInStock());
});
आइए देखें कि MongoTemplate . के साथ ऐसा कैसे करें :
Query query = new Query();
query.fields()
.include("item")
.include("status")
.include("size.uom");
4.5. एंबेडेड फ़ील्ड्स बहिष्कृत करें
इसी तरह, एम्बेडेड फ़ील्ड को बाहर करने से वे हमारे परिणाम से बाहर हो जाते हैं, हालांकि, यह शेष एम्बेड किए गए फ़ील्ड को जोड़ देगा :
List<Inventory> inventoryList = inventoryRepository.findByStatusExcludeEmbeddedFields("A");
inventoryList.forEach(i -> {
assertNotNull(i.getItem());
assertNotNull(i.getStatus());
assertNotNull(i.getId());
assertNotNull(i.getSize());
assertNull(i.getSize().getUom());
assertNotNull(i.getSize().getHeight());
assertNotNull(i.getSize().getWidth());
assertNotNull(i.getInStock());
});
आइए एक नजर डालते हैं MongoTemplate . पर संस्करण:
Query query = new Query();
query.fields()
.exclude("size.uom");
4.6. एरे में एंबेडेड फ़ील्ड शामिल करें
इसी तरह अन्य क्षेत्रों की तरह, हम एक सरणी के क्षेत्र का प्रक्षेपण भी जोड़ सकते हैं:
List<Inventory> inventoryList = inventoryRepository.findByStatusIncludeEmbeddedFieldsInArray("A");
inventoryList.forEach(i -> {
assertNotNull(i.getItem());
assertNotNull(i.getStatus());
assertNotNull(i.getId());
assertNotNull(i.getInStock());
i.getInStock()
.forEach(stock -> {
assertNull(stock.getWareHouse());
assertNotNull(stock.getQuantity());
});
assertNull(i.getSize());
});
आइए MongoTemplate . का उपयोग करके इसे लागू करें :
Query query = new Query();
query.fields()
.include("item")
.include("status")
.include("inStock.quantity");
4.7. स्लाइस . का उपयोग करके एरे में एंबेडेड फ़ील्ड शामिल करें
MongoDB किसी सरणी के परिणामों को सीमित करने के लिए JavaScript फ़ंक्शन का उपयोग कर सकता है - उदाहरण के लिए, स्लाइस का उपयोग करके किसी सरणी में केवल अंतिम तत्व प्राप्त करना :
List<Inventory> inventoryList = inventoryRepository.findByStatusIncludeEmbeddedFieldsLastElementInArray("A");
inventoryList.forEach(i -> {
assertNotNull(i.getItem());
assertNotNull(i.getStatus());
assertNotNull(i.getId());
assertNotNull(i.getInStock());
assertEquals(1, i.getInStock().size());
assertNull(i.getSize());
});
आइए MongoTemplate . का उपयोग करके वही क्वेरी निष्पादित करें :
Query query = new Query();
query.fields()
.include("item")
.include("status")
.slice("inStock", -1);