MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Chỉ trả lại các trường cụ thể cho một truy vấn trong dữ liệu mùa xuân MongoDB

1. Tổng quan

Khi sử dụng Spring Data MongoDB, chúng ta có thể cần hạn chế các thuộc tính được ánh xạ từ một đối tượng cơ sở dữ liệu. Thông thường, chúng tôi có thể cần điều này, ví dụ, vì lý do bảo mật - để tránh lộ thông tin nhạy cảm được lưu trữ trên máy chủ. Hoặc, chẳng hạn, chúng tôi có thể cần lọc ra một phần dữ liệu được hiển thị trong ứng dụng web.

Trong hướng dẫn ngắn này, chúng ta sẽ xem cách MongoDB áp dụng giới hạn trường.

2. Hạn chế trường MongoDB khi sử dụng phép chiếu

MongoDB sử dụng Phép chiếu để chỉ định hoặc hạn chế các trường trả về từ một truy vấn . Tuy nhiên, nếu chúng tôi đang sử dụng Dữ liệu mùa xuân, chúng tôi muốn áp dụng điều này với MongoTemplate hoặc MongoRepository .

Do đó, chúng tôi muốn tạo các trường hợp kiểm tra cho cả MongoTemplate MongoRepository nơi chúng tôi có thể áp dụng các giới hạn trường.

3. Triển khai phép chiếu

3.1. Thiết lập Đối tượng

Trước tiên, hãy tạo một Khoảng không quảng cáo lớp:

@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. Thiết lập kho lưu trữ

Sau đó, để kiểm tra MongoRepository , chúng tôi tạo một InventoryRepository . Chúng tôi cũng sẽ sử dụng ở đâu điều kiện với @Query . Ví dụ:chúng tôi muốn lọc trạng thái khoảng không quảng cáo:

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. Thêm phụ thuộc Maven

Chúng tôi cũng sẽ sử dụng MongoDB được nhúng. Hãy thêm spring-data-mongodb de.flapdoodle.embed.mongo phụ thuộc vào pom.xml của chúng tôi tệp:

<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. Kiểm tra bằng MongoRepository MongoTemplate

Đối với MongoRepository , chúng ta sẽ xem các ví dụ sử dụng @Query và áp dụng Hạn chế Trường, trong khi cho MongoTemplate , Chúng tôi sẽ sử dụng Truy vấn lớp học.

Chúng tôi sẽ cố gắng bao gồm tất cả các kết hợp khác nhau của bao gồm và loại trừ. Đặc biệt, chúng ta sẽ xem cách hạn chế các trường được nhúng hoặc thú vị hơn là các mảng bằng cách sử dụng lát cắt tài sản .

Đối với mọi thử nghiệm, chúng tôi sẽ thêm MongoRepository ví dụ đầu tiên, tiếp theo là ví dụ cho MongoTemplate .

4.1. Chỉ bao gồm các trường

Hãy bắt đầu bằng cách bao gồm một số trường. Tất cả bị loại trừ sẽ là null . Phép chiếu thêm _ id theo mặc định:

List<Inventory> inventoryList = inventoryRepository.findByStatusIncludeItemAndStatusFields("A");

inventoryList.forEach(i -> {
  assertNotNull(i.getId());
  assertNotNull(i.getItem());
  assertNotNull(i.getStatus());
  assertNull(i.getSize());
  assertNull(i.getInStock());
});

Bây giờ, hãy kiểm tra MongoTemplate phiên bản:

Query query = new Query();
 query.fields()
   .include("item")
   .include("status");

4.2. Các trường Bao gồm và Loại trừ

Lần này, chúng ta sẽ thấy các ví dụ bao gồm rõ ràng một số trường nhưng loại trừ các trường khác - trong trường hợp này, chúng tôi sẽ loại trừ _ id lĩnh vực:

List<Inventory> inventoryList = inventoryRepository.findByStatusIncludeItemAndStatusExcludeIdFields("A");

inventoryList.forEach(i -> {
   assertNotNull(i.getItem());
   assertNotNull(i.getStatus());
   assertNull(i.getId());
   assertNull(i.getSize());
   assertNull(i.getInStock());
});

Truy vấn tương đương sử dụng MongoTemplate sẽ là:

Query query = new Query();
query.fields()
  .include("item")
  .include("status")
  .exclude("_id");

4.3. Chỉ loại trừ các trường

Hãy tiếp tục bằng cách loại trừ một số trường. Tất cả các trường khác sẽ không rỗng:

List<Inventory> inventoryList = inventoryRepository.findByStatusIncludeAllButStatusAndStockFields("A");

inventoryList.forEach(i -> {
  assertNotNull(i.getItem());
  assertNotNull(i.getId());
  assertNotNull(i.getSize());
  assertNull(i.getInStock());
  assertNull(i.getStatus());
});

Và, hãy xem MongoTemplate phiên bản:

Query query = new Query();
query.fields()
  .exclude("status")
  .exclude("inStock");

4.4. Bao gồm các trường được nhúng

Một lần nữa, bao gồm các trường được nhúng sẽ thêm chúng vào kết quả của chúng tôi:

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());
});

Hãy xem cách thực hiện tương tự với MongoTemplate :

Query query = new Query();
query.fields()
  .include("item")
  .include("status")
  .include("size.uom");

4.5. Loại trừ các trường được nhúng

Tương tự như vậy, việc loại trừ các trường được nhúng sẽ giúp chúng không có trong kết quả của chúng tôi, tuy nhiên, nó sẽ thêm phần còn lại của các trường được nhúng :

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());
});

Hãy cùng xem qua MongoTemplate phiên bản:

Query query = new Query();
query.fields()
  .exclude("size.uom");

4.6. Bao gồm các trường được nhúng trong mảng

Tương tự với các trường khác, chúng ta cũng có thể thêm hình chiếu của trường của mảng:

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());
});

Hãy triển khai tương tự bằng cách sử dụng MongoTemplate :

Query query = new Query();
query.fields()
  .include("item")
  .include("status")
  .include("inStock.quantity");

4.7. Bao gồm các trường được nhúng trong mảng bằng cách sử dụng lát cắt

MongoDB có thể sử dụng các hàm JavaScript để giới hạn kết quả của một mảng - ví dụ:chỉ lấy phần tử cuối cùng trong một mảng bằng cách sử dụng slice :

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());
});

Hãy thực hiện cùng một truy vấn bằng cách sử dụng MongoTemplate :

Query query = new Query();
query.fields()
  .include("item")
  .include("status")
  .slice("inStock", -1);

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mẹo quản lý MongoDB từ xa

  2. Truyền từ con trỏ mongodb tới Phản hồi nhanh trong node.js

  3. Kết quả nhóm theo khoảng thời gian 15 phút trong MongoDb

  4. Khởi tạo toàn cầu không thành công:BadValue Không hợp lệ hoặc không có ngôn ngữ người dùng được đặt. Hãy đảm bảo các biến môi trường LANG và / hoặc LC_ * được đặt chính xác

  5. Mức sử dụng dữ liệu trong bộ đệm của giai đoạn sắp xếp tràn vượt quá giới hạn nội bộ