Kết nối mongodb của người lập mô hình mặt trăng

Ghi chú. Bài viết mang chất lưu lại kiến ​​thức để sử dụng sau này mày mò google khắp nơi giải chút mới giải quyết được, nếu bạn nào gặp vấn đề tương tự thì có thể tham khảo

Số là mình bắt đầu thực hiện một dự án mới trên Spring Boot và cần làm việc với NoSQL, cụ thể là Mông Gô Đê Bê (MongoDB), trước thì mình đã đọc và tham khảo qua về SQL và NoSQL rồi, tuy nhiên mình . Đơn giản thì mình nghĩ chắc connect Mongo cũng thế thôi, vì JPA và Hibernate viết ra để dùng ALL In ONE mà. Cơ mà đâm đầu vào thì cũng mệt vãi đạn

Nội dung chính Hiển thị

  • Ghi chú. Bài viết mang chất lưu lại kiến ​​thức để sử dụng sau này mày mò google khắp nơi giải chút mới giải quyết được, nếu bạn nào gặp vấn đề tương tự thì có thể tham khảo
  • 1 - Thêm phụ thuộc
  • 2 - Config trong file yml
  • 3 - Entity - Chỉ cần @Id thôi nhé, không cần chỉ định cột cũng dc. bên phải
  • 4- Kho lưu trữ
  • 5 - Cấu hình Mongo
  • open start
  • Các lưu ý cần thiết
  • Các công cụ cơ bản
  • Các thuật ngữ thường dùng trong bài viết
  • Thực hiện
  • Thao tác MongoDb dựa trên Tập hợp với Con trỏ
  • Thao tác con trỏ trong Spring
  • Kết luận

Những thứ cần chuẩn bị

1 project Spring Boot maven hay gradle thì tùy, mình dùng gradle

Máy chủ Mongo (Local cũng được)

Mongo Compass( Có cũng dc mà không cũng được)

IDE - tất nhiên ( Mxài Intelij, bản 2020 trở lên tool mới hỗ trợ kết nối Mongo nhé)

Trước tiên các bạn cần nhớ table in Mongo not call is Table which

Bảng = Bộ sưu tập

Row = Documnent ( Giá trị khóa cặp)

Còn một vài thứ nữa các bạn tham khảo bài viết của bạn này nhé. Hướng dẫn Mongo cơ bản

Ấy thế mà trong thực thể @Table lại thay bằng @Document chứ không có cái @Collection ) Méo hiểu

Kết nối mongodb của người lập mô hình mặt trăng

) Méo hiểu

CỤ THỂ thì các bước cần làm như sau

1 - Thêm phụ thuộc

Các bạn cần

org.springframework.data:spring-data-mongodb
org.mongodb:mongo-java-driver:3.12.11

2 - Config trong file yml

Chắc chắn các bạn đã đồng ý với kiểu kết nối này

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/cloudsigning
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password:
    jpa:
      hibernate:
        ddl-auto: create
        naming:
          implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
          physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategyserver

Nhưng cụ Mongo thì đi một quãng đường riêng

spring:
  data:
    mongodb:
      authentication-database: admin
      database: test
      host: localhost
      port: 27017 

Ồ, làm tốt lắm. Có vẻ như rút gọn nhờ

Chạy cái coi. Error cạo mặt lợn, và sau 10p gò vấp à nó k dùng @Table mà xài @Document + Repository thì extends MongoRepository thay vì JpaRepository

3 - Entity - Chỉ cần @Id thôi nhé, không cần chỉ định cột cũng dc. bên phải

@Entity
@Document(value = "user")
public class UserAccount {
    @Id
    private Integer id;

    private String userName;

4- Kho lưu trữ

@Repository
public interface UserAccountRepository extends MongoRepository {

 }

5 - Cấu hình Mongo

===> có vẻ ổn nhờ, Run cái nữa nào --- lại lỗi-- Google tiếp. A back config next

@SpringBootApplication(loại trừ = {DataSourceAutoConfiguration. lớp, MongoAutoConfiguration. lớp, MongoDataAutoConfiguration. lớp})

== running try, hơi giunnnnn. Reẹo. Lỗi này có vẻ như tường minh tí

Error here. Không thể tìm thấy một thành phần yêu cầu một bean có tên 'mongoTemplate'

Có vẻ thiếu ngữ cảnh không kiếm được cái đậu kia. Lại gò GG tiếp Đây rồi, mò mãi mới kiếm được trên GitHub, chắc của mấy anh Ấn thần thánh

@Configuration
public class MongoConfig extends AbstractMongoClientConfiguration {

    @Override
    protected String getDatabaseName() {
        return env.getProperty("spring.data.mongodb.database");
    }

}

Chạy lại cái nào Úi xời mừng rơi nước mắt, chạy rồi )))))))))))

)))))))))))

Đất, cụ có thể là các bạn chú ý mấy cái nghĩ ngợi đó

Và đặc biệt trong file pom/build không thiếu thằng này nhé " org. mongodb. mongo-java-driver" , no it is a cái AbstractMongoClientConfiguration ko có đủ client để chạy và hẹo luôn nha. Còn lại CRUD thì khả năng không có các loại khác đâu, Query thì nhớ xài PLSQL nhá

Có thể các bạn thấy mình viết đơn giản có ba lần "**Chạy thử phát xem**" là chạy mượt mà bày vẽ viết cái bài hướng dẫn. Thực tế thì mình mất xừ buổi tối để nối mà chả giải quyết được việc gì khác, " **Run try**" cũng đâu đấy 10-20 lần nha ))

))

Cảm tạ

P/S bạn nào có cách rút ngắn hơn thì chỉ mình cái nhé

open start

Như chúng ta đã biết, việc sử dụng Aggregation trong mongoDb để thực hiện xử lý dữ liệu trong MongoDb là rất cần thiết. Đây là một khung mạnh mẽ linh hoạt trong quá trình truy vấn và xử lý dữ liệu với các toán tử mạnh mẽ cũng như hỗ trợ xử lý dữ liệu với số lượng lớn. Loạt bài trước, tác giả đã miêu tả tổng quan về Aggregation framework trong mongoDb. Các bạn có thể tham khảo tại đây. https. //viblo. asia/p/tim-hieu-ve-aggregation-framework-trong-mongodb-Az45brRV5xY. Bài viết này sẽ đi sâu vào tìm hiểu cách tích Aggregation vào Spring để có thể linh hoạt hơn trong việc xử lý dữ liệu

Các lưu ý cần thiết

Các công cụ cơ bản

  • maven
  • khởi động mùa xuân
  • cơ sở dữ liệu. MongoDb (có thể tải xuống tại https. //www. mongodb. com/download-center/community nên chọn hệ điều hành phù hợp và tải xuống)
  • phụ thuộc. Web khởi động mùa xuân, dữ liệu khởi động mùa xuân mongodb
  • Robo3T
  • Người phát thơ

Lưu ý

  • Trong loạt bài viết này sẽ trình bày xử lý Aggregation trong mùa xuân. Các thao tác xử lý cơ bản như CRUD sẽ không được cập nhật trong bài viết này. Các bạn có thể tìm hiểu thêm trên internet. Về mặt cơ bản các thuật toán CRUD trong mongoDb vẫn xử lý các lý do tương tự như trong hệ thống cơ sở dữ liệu (RDBMS). Bài viết này sẽ trình bày thêm về việc xử lý dữ liệu dựa trên con trỏ để xử lý các bản ghi vượt quá 16mb

Các thuật ngữ thường dùng trong bài viết

Khác với hệ cơ sở dữ liệu RDBMS, Spring data MongoDb sử dụng thuật ngữ khác để thực hiện ánh xạ, xử lý và thao tác trên MongoDb, Dưới đây là bảng so sánh giữa 2 hệ thống cơ sở dữ liệu và sự khác nhau của nó

MongoDbRDBMSÝ nghĩaDocumentEntityĐánh dấu đây là một lớp có thể thực hiện thao tác ánh xạ và xử lý dữ liệu với cơ sở dữ liệu, xác định tên DocumentFieldColumnXác định tên cột (với RDBMS ) hoặc tên trường với MongoDb để thực hiện ánh xạ

Bài viết sẽ thực hiện bằng cách sử dụng Thao tác tổng hợp với Bộ sưu tập tên DB là Nhân viên bao gồm các thông tin như bên dưới

/* 1 */
{
    "_id" : ObjectId("5daa7b6cd20119058c403b85"),
    "firstName" : "A",
    "lastName" : "Nguyen Van",
    "age" : 25,
    "location" : "DN",
    "salary" : 22.2
}

/* 2 */
{
    "_id" : ObjectId("5daa7b6cd20119058c403b86"),
    "firstName" : "B",
    "lastName" : "Tran Van",
    "age" : 27,
    "location" : "HN",
    "salary" : 22.7
}

/* 3 */
{
    "_id" : ObjectId("5daa7b6cd20119058c403b87"),
    "firstName" : "C",
    "lastName" : "Le Van",
    "age" : 28,
    "location" : "DN",
    "salary" : 80.2
}

Thực hiện

Trước tiên cần tiến hành tạo dự án bằng spring boot bằng cách truy cập vào trang bắt đầu. mùa xuân. io with the configuration information as below

Về cấu hình thông tin. Group and Artifact có thể tùy chọn đặt tên. Tuy nhiên, nên đặt theo quy tắc. com. tên công ty hoặc cá nhân. tên dự án muốn đặt. Tại mục Dependencies chọn 2 phụ thuộc là Spring Web và Spring Data Mongo Db. Lombok phụ thuộc có thể tùy chọn có hoặc không

Tiếp theo để tiến hành kết nối với cơ sở dữ liệu cơ sở dữ liệu, chúng ta cần định cấu hình kết nối với MongoDb trong các ứng dụng tệp. thuộc tính hoặc ứng dụng. yml as the bottom

Các ứng dụng. đặc tính

server.port=8989
spring.data.mongodb.uri=mongodb://root:[email protected]:27017/BaoTrung
spring.jpa.show-sql=true
logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG
logging.level.org.springframework.web = DEBUG

Cấu hình trên máy chủ duy nhất đang chạy ở cổng 8989, mùa xuân. dữ liệu. mongodb. uri định cấu hình kết nối với cơ sở dữ liệu với các thông số như tên người dùng là root, mật khẩu là root, cổng 27017(default của mongoDb) và cơ sở dữ liệu là BaoTrung. Các thông số tiếp theo chỉ định việc hiển thị các lệnh khi thao tác với mongoDb cũng như nhật ký cấp độ khi thực hiện thao tác. Trong loạt bài viết đang sử dụng ở mức gỡ lỗi. cổng 8989, mùa xuân. dữ liệu. mongodb. uri định cấu hình kết nối với cơ sở dữ liệu với các thông số như tên người dùng là root, mật khẩu là root, cổng 27017(default của mongoDb) và cơ sở dữ liệu là BaoTrung.
Các thông số tiếp theo chỉ định việc hiển thị lệnh khi thao tác với mongoDb cũng như nhật ký cấp độ khi thực hiện thao tác. Trong loạt bài viết đang sử dụng ở mức gỡ lỗi.

Có một lưu ý ở đây. Trong bài viết đang sử dụng Mongo 3. 0 Java driver,cấu hình sẽ thông qua uri. Cấu hình bên dưới sẽ không thành công đối với phiên bản Mongo 3. 0 Trình điều khiển Java trở lên (chỉ áp dụng với Mongo 3. 0 Java driver trở xuống). Lý do là mùa xuân. dữ liệu. mongodb. máy chủ và mùa xuân. dữ liệu. mongodb. cổng đã bị loại bỏ trong Mongo 3. 0 trình điều khiển JavaMongo 3. 0 Java driver,cấu hình sẽ thông qua uri. Cấu hình bên dưới sẽ không thành công đối với phiên bản Mongo 3. 0 Trình điều khiển Java trở lên (chỉ áp dụng với Mongo 3. 0 Java driver trở xuống). Lý do là mùa xuân. dữ liệu. mongodb. máy chủ và mùa xuân. dữ liệu. mongodb. cổng đã bị loại bỏ trong Mongo 3. 0 Trình điều khiển Java

//Không áp dụng được với Mongo 3. 0 Trình điều khiển Java trở lên

________số 8

Người mẫu

Thực hiện việc tạo một lớp có tên là Nhân viên như bên dưới. Nhân viên như phía dưới

Nhân viên. lớp

@Document(collection = "Employees")
public class Employee {

    @Id
    private String id;
    @Field(value = "firstName")
    @NotBlank(message = "FirstName can't empty!")
    private String firstName;
    @NotBlank(message = "LastName can't empty!")
    private String lastName;
    @NotNull
    private Integer age;
    @NotBlank(message = "Location can't empty!")
    private String location;
    private Double salary;

    public Employee() {
    }

    public Employee(String id, String firstName, String lastName, Integer age, String location, Double salary) {
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
        this.location = location;
        this.salary = salary;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getLocation() {
        return location;
    }

    public void setLocation(String location) {
        this.location = location;
    }

    public Double getSalary() {
        return salary;
    }

    public void setSalary(Double salary) {
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "id='" + id + '\'' +
                ", firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", age=" + age +
                ", location='" + location + '\'' +
                ", salary=" + salary +
                '}';
    }
}

Lớp trên chỉ đơn giản là sử dụng @Document xác định nó là một thực thể để có thể thao tác với MongoDb với các trường như Tên, Họ, Lương ,Tuổi, Vị trí. Có một lưu ý ở đây là do MongoDb đang sử dụng tài liệu có tên là Employee nên nếu muốn ánh xạ đúng tên tài liệu có tên là Employess thì chúng ta sẽ sử dụng

spring:
  data:
    mongodb:
      authentication-database: admin
      database: test
      host: localhost
      port: 27017 
7@Document xác định nó là một thực thể để có thể thao tác với MongoDb với các trường như FirstName, LastName, Salary ,Age, Location. Có một lưu ý ở đây là do MongoDb đang sử dụng tài liệu có tên là Employee nên nếu muốn ánh xạ đúng tên tài liệu có tên là Employess thì chúng ta sẽ sử dụng
spring:
  data:
    mongodb:
      authentication-database: admin
      database: test
      host: localhost
      port: 27017 
7

Tạo một lớp tên là EmployeeController và xác định các api cần thiết cho việc xử lý dữ liệu. Ở đây, chúng ta sẽ xác định các api như findByLocation ,calculTotalUser và calculatorSalaryEmployeeController và thực hiện xác định các api cần thiết cho việc xử lý dữ liệu. Ở đây chúng ta sẽ xác định các api như findByLocation , computeTotalUser và calculatorSalary

Bộ điều khiển.

nhân viênđiều khiển

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/cloudsigning
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password:
    jpa:
      hibernate:
        ddl-auto: create
        naming:
          implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
          physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategyserver
0

Lớp điều khiển phía trên sẽ xác định các api cần thiết, các tham số đầu vào và trả về phản hồi chứa dữ liệu được bao bọc trong các DTO như EmployeeResult ,EmployeeDto based on information of each API. Các DTO này sẽ được định nghĩa bên dưới. Lưu ý rằng ở đây bộ điều khiển sẽ gọi trực tiếp đến kho lưu trữ không thông qua lớp dịch vụ hiện tại không có nhiều logic phức tạp để xử lý và đây là những xử lý đơn giản. Tùy theo logic và các yêu cầu mà các bạn có thể sử dụng để phù hợp trong từng dự án. EmployeeResult ,EmployeeDto dựa trên thông tin của mỗi API. Các DTO này sẽ được định nghĩa bên dưới. Lưu ý rằng ở đây bộ điều khiển sẽ gọi trực tiếp đến kho lưu trữ không thông qua lớp dịch vụ hiện tại không có nhiều logic phức tạp để xử lý và đây là những xử lý đơn giản. Tùy theo logic và các yêu cầu mà các bạn có thể sử dụng để phù hợp trong từng dự án

Tạo giao diện với tên là EmployeeRepository và EmployeeRepositoryCustom. EmployeeRepository và EmployeeRepositoryCustom

Kho lưu trữ nhân viên

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/cloudsigning
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password:
    jpa:
      hibernate:
        ddl-auto: create
        naming:
          implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
          physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategyserver
1

Nhân viênKho lưu trữ Tùy chỉnh

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/cloudsigning
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password:
    jpa:
      hibernate:
        ddl-auto: create
        naming:
          implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
          physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategyserver
2

Ở giao diện EmployeeRepositoryCustom chúng ta sẽ định cấu hình 3 method làEmployeeRepositoryCustom chúng ta sẽ định cấu hình 3 method là

  • fetchAllLastNameByLocation với tham số là vị trí và trả về 1 danh sách các LastName dựa trên vị trí, với tham số là vị trí và trả về 1 danh sách các LastName dựa trên vị trí,
  • countTotalUserByLocation với tham số là vị trí và trả về 1 danh sách tổng số người dùng theo vị trí dựa trên DTO EmployeeResult với tham số là vị trí và trả về 1 danh sách tổng số người dùng theo vị trí dựa trên DTO EmployeeResult
  • Tính lươngByAgeAndLocation với tham số là vị trí và trả về 1 danh sách các mức lương tương ứng dựa trên tuổi và vị trí với tham số là vị trí và trả về 1 danh sách các mức lương tương ứng dựa trên tuổi và vị trí

nhân viênkết quả.

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/cloudsigning
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password:
    jpa:
      hibernate:
        ddl-auto: create
        naming:
          implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
          physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategyserver
3

nhân viênDto

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/cloudsigning
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password:
    jpa:
      hibernate:
        ddl-auto: create
        naming:
          implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
          physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategyserver
4

Tạo một lớp có tên là EmployeeRepositoryCustomImpl và thực hiện triển khai lại EmployeeRepositoryCustom như phía dưới. EmployeeRepositoryCustomImpl và thực hiện triển khai lại EmployeeRepositoryCustom như bên dưới

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/cloudsigning
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password:
    jpa:
      hibernate:
        ddl-auto: create
        naming:
          implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
          physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategyserver
5

Chúng ta sẽ thực hiện tính toán trong 3 phương thức này bằng cách sử dụng Aggregation based on MongoTemplate. Vậy MongoTemplate là gì ? . khung mùa xuân. dữ liệu. tài liệu. mongodb, cung cấp các tính năng phong phú được thiết lập để tương tác với cơ sở dữ liệu. MongoTemplate cung cấp các phương thức sử dụng để tạo, cập nhật, xóa và truy vấn tài liệu MongoDB và cung cấp ánh xạ giữa các mô hình và tài liệu. Đây là một lớp rất quan trọng trong việc thao tác với mongoDbAggregation dựa trên MongoTemplate. Vì vậy MongoTemplate là gì ?
Lớp MongoTemplate, nằm trong gói tổ chức. khung mùa xuân. dữ liệu. tài liệu. mongodb, cung cấp các tính năng phong phú được thiết lập để tương tác với cơ sở dữ liệu. MongoTemplate cung cấp các phương thức sử dụng để tạo, cập nhật, xóa và truy vấn tài liệu MongoDB và cung cấp ánh xạ giữa các mô hình và tài liệu. Đây là một lớp rất quan trọng trong thao tác với mongoDb

Tích hợp MongoTemplate vào EmployeeRepositoryCustom như sau. MongoTemplate vào EmployeeRepositoryCustom as after

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/cloudsigning
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password:
    jpa:
      hibernate:
        ddl-auto: create
        naming:
          implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
          physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategyserver
6

Đối với phương thức fetchAllLastNameByLocation sẽ tiến hành xử lý như sau. fetchAllLastNameByLocation sẽ tiến hành xử lý như sau

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/cloudsigning
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password:
    jpa:
      hibernate:
        ddl-auto: create
        naming:
          implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
          physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategyserver
7

Ở đây chúng ta có một lớp gọi là Criteria. Vậy Criteria là gì ? . khung mùa xuân. dữ liệu. mongodb. cốt lõi. truy vấn cung cấp nhiều phương thức để thực hiện truy vấn như WHERE , IS , LT, GT. Nó cũng cung cấp một cách tuần tự việc thực hiện các truy vấn đó. Tiêu chuẩn. Vậy Criteria là gì ? . khung mùa xuân. dữ liệu. mongodb. cốt lõi. truy vấn cung cấp nhiều phương thức để thực hiện truy vấn như WHERE , IS , LT, GT. Nó cũng cung cấp một cách tuần tự việc thực hiện các truy vấn đó

spring:
  data:
    mongodb:
      authentication-database: admin
      database: test
      host: localhost
      port: 27017 
8 dùng để tạo ra một tiêu chí chứa điều kiện là các vị trí trong cơ sở dữ liệu phải bằng với vị trí từ tham số đã nhập vào từ Bộ điều khiển. tiêu chí chứa điều kiện là các vị trí trong cơ sở dữ liệu phải bằng với vị trí từ tham số đã nhập vào từ Bộ điều khiển.
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/cloudsigning
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password:
    jpa:
      hibernate:
        ddl-auto: create
        naming:
          implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
          physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategyserver
8

Câu lệnh trên được sử dụng để thực hiện tạo một đường ống có khớp toán tử (tiêu chí) với tiêu chí đã định nghĩa về phía trên và nhóm theo tên cuối cùng

Kế đến câu lệnh

spring:
  data:
    mongodb:
      authentication-database: admin
      database: test
      host: localhost
      port: 27017 
9
spring:
  data:
    mongodb:
      authentication-database: admin
      database: test
      host: localhost
      port: 27017 
9

used mongoTemplate thao tác với cơ sở dữ liệu với aggregation đã được định nghĩa phía trên, tên collections là Employee và trả về DTO là EmployeeDto. classaggregation is default on, collections name is Nhân viên và trả về DTO là EmployeeDto. lớp

Cuối cùng các câu lệnh như phía dưới thực hiện tạo ra 1 danh sách các LastName với kiểu String, lấy kết quả từ các kết quả đã trả về , lặp và trả về danh sách các LastNameLastName với kiểu String, lấy kết quả từ các kết quả đã trả về , it

Kết quả khi thực hiện cuộc gọi API trên người đưa thư

Nhìn vào log trong spring, chúng ta có thể thấy dễ dàng Spring Data Mongo đã thực hiện phân tích cú pháp lệnh chúng ta viết phía sau cú pháp MongoDb theo dạng Pipeline tuần tự. khớp -> nhóm và thực hiện thao tác với MongoDb

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/cloudsigning
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password:
    jpa:
      hibernate:
        ddl-auto: create
        naming:
          implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
          physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategyserver
9

Đối với phương thức countTotalUserByLocation sẽ thực hiện tính toán như sau. countTotalUserByLocation sẽ thực hiện tính toán như sau

spring:
  data:
    mongodb:
      authentication-database: admin
      database: test
      host: localhost
      port: 27017 
0

Cách thực hiện tương tự như ví dụ trên. Thực hiện việc tạo dựa trên một Tiêu chí để thực hiện tìm kiếm dựa trên Vị trí và sử dụng Tập hợp để tạo các Đường ống để thực hiện tuần tự. Nhóm vị trí và thực hiện Đếm trên từng vị trí đó. Tuy nhiên, có 1 sự khác biệt là chúng ta sẽ sử dụng thêm một lớp là AggregationOperation để xử lý riêng cho từng toán tử như đối sánh, nhóm. Điều này làm cho mã của chúng ta rõ ràng và dễ dàng duy trì hơn. Ở đây chúng ta sẽ thực hiện lấy kết quả trực tiếp từ AggregationResults bằng phương thức getMappedResults được định nghĩa sẵn trong api của mongoDb. Tập hợp để tạo các đường ống để thực hiện tuần tự. Nhóm vị trí và thực hiện Đếm trên từng vị trí đó. Tuy nhiên, có 1 sự khác biệt là chúng ta sẽ sử dụng thêm một lớp là AggregationOperation để xử lý riêng cho từng toán tử như đối sánh, nhóm. Điều này làm cho mã của chúng ta rõ ràng và dễ dàng duy trì hơn. Ở đây chúng ta sẽ thực hiện lấy kết quả trực tiếp từ AggregationResults bằng phương thức getMappedResults được định nghĩa sẵn trong api của mongoDb

Kết quả khi thực hiện api. Kết quả hiển thị trên log spring. Kết quả hiển thị trên log spring

spring:
  data:
    mongodb:
      authentication-database: admin
      database: test
      host: localhost
      port: 27017 
1

Cũng tương tự như ví dụ về phía trên, Spring Data MongoDb dựa trên các lệnh chúng tôi đã viết để thực hiện việc tạo các Đường ống theo tuần tự. $match theo vị trí , $group theo vị trí và tính tổng dựa trên $sum

Đối với phương thức tínhSalaryByAgeAndLocation thực hiện xử lý như sau. Tính lươngByAgeAndLocation thực hiện xử lý như sau

spring:
  data:
    mongodb:
      authentication-database: admin
      database: test
      host: localhost
      port: 27017 
2

Đối với phương thức tínhSalaryByAgeAndLocation sẽ thực hiện tính toán dựa trên 2 đk. tuổi và địa điểm. Tiêu chí sẽ thực hiện lấy những đk có tuổi lớn hơn hoặc bằng tuổi được nhập vào và vị trí bằng vị trí từ thông số được nhập vào. Toán tử AggregationOperation sẽ thực hiện tương tự các trình tự như đối sánh, nhóm theo vị trí, tính tổng dựa trên tiền lương và thực hiện tham chiếu đến từng Họ của Nhân viên bằng lệnh đẩy. computeSalaryByAgeAndLocation sẽ thực hiện tính toán dựa trên 2 đk. tuổi và địa điểm. Tiêu chí sẽ thực hiện lấy những đk có tuổi lớn hơn hoặc bằng tuổi được nhập vào và vị trí bằng vị trí từ thông số được nhập vào. Toán tử AggregationOperation sẽ thực hiện tương tự các trình tự như đối sánh, nhóm theo vị trí, tính tổng dựa trên tiền lương và thực hiện tham chiếu đến từng Họ của Nhân viên bằng lệnh đẩy

Kết quả

Nhật ký

spring:
  data:
    mongodb:
      authentication-database: admin
      database: test
      host: localhost
      port: 27017 
3

We can see. Spring Mongo Db đã phân tích cú pháp các câu lệnh mà chúng viết ra dưới dạng Pipeline , với các toán tử khớp. tuổi lớn hơn hoặc bằng 23, vị trí Nhóm DN theo vị trí tính tổng dựa trên tiền lương

Thao tác MongoDb dựa trên Tập hợp với Con trỏ

Qua các ví dụ trên mongoTemplate cung cấp rất nhiều tiện ích cũng như phương thức thao tác với mongoDb. Tuy nhiên có 1 hạn chế ở đây ? . Vì sao như vậy?

Về con trỏ là gì cũng như có những phương thức nào các bạn có thể tham khảo tài liệu của MongoDb. https. // tài liệu. mongodb. com/manual/reference/method/js-cursor/?searchProperty=current&query=Cursor. Lưu ý là Cursor có các phương thức riêng để xử lý, không thể sử dụng các phương thức của bộ sưu tập để xử lý Cursor

Lưu ý. Lí do sử dụng dựa trên Con trỏ chỉ áp dụng đối với lượng dữ liệu vượt quá 16 MB. Nếu dữ liệu nhỏ hơn 16 MB, hãy sử dụng mongoTemplate. Con trỏ sử dụng sẽ khiến cơ sở dữ liệu của bạn chậm đi đáng kể dẫn đến hiệu suất không ổn định

Thao tác con trỏ trong Spring

Trước tiên chúng ta tạo 1 phương thức trong lớp EmployeeController như thế này

spring:
  data:
    mongodb:
      authentication-database: admin
      database: test
      host: localhost
      port: 27017 
4

Phương thức này sẽ trả về 1 danh sách các LastName không trùng lặp

Tiếp tục theo cách tạo một phương thức có tên fetchAllLastNameByLocationUsedCursor trong Giao diện EmployeeRepositoryCustom và EmployeeRepositoryCustomImpl

Nhân viênKho lưu trữ Tùy chỉnh.

@Entity
@Document(value = "user")
public class UserAccount {
    @Id
    private Integer id;

    private String userName;
0

Nhân viênRepositoryCustomImpl

Tiến hành tìm tất cả các LastName dựa trên vị trí bằng Cursor

spring:
  data:
    mongodb:
      authentication-database: admin
      database: test
      host: localhost
      port: 27017 
5

Thay vì sử dụng các lớp Employee để thực hiện ánh xạ, BasicDBObject thực hiện đọc trực tiếp vào Bson với tên trường là vị trí, MongoClient xác định các kết nối như tên máy chủ, cổng, tên cơ sở dữ liệu. Phía trên tên host là localHost,port là 27017 và tên cơ sở dữ liệu là BaoTrung. Ở đây chúng ta sử dụng lớp DBCollection để lấy bộ sưu tập trực tiếp từ MongoClient. Bộ sưu tập được up ở đây là Nhân viên. Thực hiện tạo một Set chứa các LastName mong muốn trả về. Con trỏ con trỏ = coll. tìm (truy vấn); . Các phương thức như con trỏ. hasNext() và con trỏ. next() dùng để thực hiện tuần tự tìm kiếm trong các bảng ghi. Last Name. ví dụ thêm (((Chuỗi). get("Họ"))); . BasicDBObject thực hiện đọc trực tiếp vào Bson với tên trường là vị trí, MongoClient xác định các kết nối như tên máy chủ, cổng, tên cơ sở dữ liệu. Phía trên tên host là localHost,port là 27017 và tên cơ sở dữ liệu là BaoTrung. Ở đây chúng ta sử dụng lớp DBCollection để lấy bộ sưu tập trực tiếp từ MongoClient. Bộ sưu tập được up ở đây là Nhân viên. Thực hiện tạo một Set chứa các LastName mong muốn trả về. Con trỏ con trỏ = coll. tìm (truy vấn); . Các phương thức như con trỏ. hasNext() và con trỏ. next() dùng để thực hiện tuần tự tìm kiếm trong các bảng ghi. Last Name. ví dụ thêm (((Chuỗi). get("Họ")));

Kết quả khi thực hiện cuộc gọi api

Đăng nhập vào mùa xuân

spring:
  data:
    mongodb:
      authentication-database: admin
      database: test
      host: localhost
      port: 27017 
6

Nhìn vào nhật ký có thể thấy bất kỳ Spring Data nào MongoDb đã k còn phân tích cú pháp ra các Pipeline nữa mà công việc thực hiện hoàn toàn dựa trên thao tác con trỏ trên bộ nhớ của mongoDB và trả về kết quả

Kết luận

Qua bài viết trên , mình đã giới thiệu cách sử dụng Aggregation in spring, cách sử dụng mongoTemplate và Cursor. Sự khác nhau và khi nào nên sử dụng Cursor khi nào không. Hy vọng sẽ giúp mọi người hiểu thêm về Tổng hợp và tích hợp vào dự án. Hẹn gặp lại mọi người ở các bài viết tiếp theoAggregation trong spring, cách sử dụng mongoTemplate và Cursor. Sự khác nhau và khi nào nên sử dụng Cursor khi nào không. Hy vọng sẽ giúp mọi người hiểu thêm về Tổng hợp và tích hợp vào dự án. Hẹn gặp lại mọi người ở các bài viết tiếp theo