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ảoSố 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 Show
Nội dung chính Hiển thị
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 ) Méo hiểuCỤ THỂ thì các bước cần làm như sau 1 - Thêm phụ thuộcCác bạn cần
2 - Config trong file ymlChắc chắn các bạn đã đồng ý với kiểu kết nối này
Nhưng cụ Mongo thì đi một quãng đường riêng
Ồ, 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
4- Kho lưu trữ
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
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 startNhư 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ếtCác công cụ cơ bản
Lưu ý
Các thuật ngữ thường dùng trong bài viếtKhá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
Thực hiệnTrướ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
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ó 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ố 8Ngườ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
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 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 7Tạ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 0Lớ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 1Nhân viênKho lưu trữ Tùy chỉnh 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à
nhân viênkết quả. 3nhân viênDto 4Tạ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 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ì ? Tích hợp MongoTemplate vào EmployeeRepositoryCustom như sau. MongoTemplate vào EmployeeRepositoryCustom as after 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 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 đó 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. 8Câ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 9 9used 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 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 0Cá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 1Cũ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 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ý 3We 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 SpringTrước tiên chúng ta tạo 1 phương thức trong lớp EmployeeController như thế này 4Phươ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. 0Nhân viênRepositoryCustomImpl Tiến hành tìm tất cả các LastName dựa trên vị trí bằng Cursor 5Thay 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 6Nhì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ậnQua 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 |