MongoDB là một cơ sở dữ liệu NoSQL định hướng tài liệu mã nguồn mở. Chúng tôi đã giới thiệu cách sử dụng
$ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
4 để chạy các lệnh CRUD cơ bản trong bảng điều khiển. Bên cạnh đó, chúng tôi cũng đã giới thiệu cách sử dụng MongoDB Atlas để lưu trữ dữ liệu và máy chủ MongoDB của bạn. Trong bài đăng này, chúng ta sẽ tiến thêm một bước và tìm hiểu các truy vấn MongoDB nâng cao cho các tài liệu lồng nhau bằng cách sử dụng toán tử $ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
5 từ các ví dụ thực tế. Chúng tôi vẫn sẽ sử dụng $ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
6 để chạy các truy vấn trong bảng điều khiển nên bạn không cần cài đặt thêm bất kỳ thứ gì. Tuy nhiên, bạn có thể sử dụng IDE đồ họa cho MongoDB nếu bạn thích làm việc trong môi trường trực quan hơnHình ảnh từ Pixabay
Trước khi bắt đầu hành trình nâng cao này, chúng ta nên có sẵn một máy chủ MongoDB. Bạn có thể sử dụng Docker để khởi động máy chủ MongoDB trong vùng chứa hoặc sử dụng MongoDB Atlas để khởi động máy chủ được lưu trữ và duy trì bởi Atlas. Để đơn giản, chúng tôi sẽ sử dụng bộ chứa Docker trong bài đăng này, nhưng bạn có thể tự do chọn cái mình thích. Các lệnh để bắt đầu bộ chứa Docker cho MongoDB là
$ docker network create mongo-net$ docker run --detach --network mongo-net --name mongo-server \
--env MONGO_INITDB_ROOT_USERNAME=admin \
--env MONGO_INITDB_ROOT_PASSWORD=pass \
--env MONGO_INITDB_ROOT_DATABASE=admin \
--volume mongo-data:/data/db \
--publish 27017:27017 \
mongo:5.0.6
Bạn có thể
$ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
7 trên máy tính của mình hoặc sử dụng cái đi kèm với bộ chứa Docker$ docker exec -it mongo-server bash
$ mongosh "mongodb://admin:pass@localhost:27017"
Bây giờ chúng ta có thể bắt đầu làm việc với cơ sở dữ liệu MongoDB bằng cách sử dụng
$ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
6. Nếu đây là lần đầu tiên bạn làm việc với $ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
6, bạn nên kiểm tra bài đăng giới thiệu này trước để không bị lạc trong các truy vấn nâng caoDữ liệu chúng tôi sẽ sử dụng trong bài đăng này là một số dữ liệu sản phẩm cho một cửa hàng máy tính xách tay trực tuyến, như được minh họa trong bài đăng cho Elaticsearch. Bạn có thể tải xuống tệp JSON này để lấy dữ liệu thô sẽ được sử dụng
Nếu bạn sử dụng
$ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
6 bên trong bộ chứa Docker như tôi, bạn cần sao chép tệp JSON vào bộ chứa$ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
Và nếu bạn sử dụng
$ docker exec -it mongo-server bash
$ mongosh "mongodb://admin:pass@localhost:27017"
0 được cài đặt trên máy tính của mình, bạn cần có tệp JSON này trong thư mục làm việc hiện tại của mình. Sau đó, chúng tôi có thể tải tệp này và chèn tất cả tài liệu vào bộ sưu tậpCác điểm chính cho đoạn mã trên
- Chúng tôi sử dụng
$ docker exec -it mongo-server bash
1 để khai báo một cơ sở dữ liệu MongoDB có tên là
$ mongosh "mongodb://admin:pass@localhost:27017"$ docker exec -it mongo-server bash
2, cơ sở dữ liệu này sẽ được tạo khi một tài liệu được chèn vào một bộ sưu tập trong đó
$ mongosh "mongodb://admin:pass@localhost:27017" - Dữ liệu JSON được tải bằng lệnh
$ docker exec -it mongo-server bash
3. Và dữ liệu được tải ở định dạng có thể được sử dụng trực tiếp bằng phương thức
$ mongosh "mongodb://admin:pass@localhost:27017"$ docker exec -it mongo-server bash
4. Dữ liệu máy tính xách tay được chèn vào một bộ sưu tập có tên là
$ mongosh "mongodb://admin:pass@localhost:27017"$ docker exec -it mongo-server bash
5
$ mongosh "mongodb://admin:pass@localhost:27017" - Phương pháp
$ docker exec -it mongo-server bash
6 được sử dụng để kiểm tra số lượng tài liệu trong bộ sưu tập và phương pháp
$ mongosh "mongodb://admin:pass@localhost:27017"$ docker exec -it mongo-server bash
7 được sử dụng để hiển thị tài liệu đầu tiên trong bộ sưu tập
$ mongosh "mongodb://admin:pass@localhost:27017"
Bây giờ dữ liệu đã sẵn sàng, chúng ta có thể bắt đầu viết một số truy vấn cho nó
Như chúng ta thấy, các tài liệu máy tính xách tay trong bộ sưu tập
$ docker exec -it mongo-server bash
$ mongosh "mongodb://admin:pass@localhost:27017"
5 có trường $ docker exec -it mongo-server bash
$ mongosh "mongodb://admin:pass@localhost:27017"
9 là một mảng các tài liệu được nhúng. Việc truy vấn và cập nhật một trường như thế này phức tạp hơn so với các trường không lồng nhau đơn giảnTrước tiên, hãy tìm tất cả các máy tính xách tay có CPU là
$ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
0. Điều này sẽ khá đơn giản vì CPU rõ ràngLưu ý rằng trường lồng nhau được truy vấn bằng ký hiệu dấu chấm và phải được đặt trong dấu ngoặc kép. Nếu bạn muốn viết các truy vấn trải rộng trên nhiều dòng bằng IDE đồ họa, vui lòng tham khảo bài đăng này về IDE cho MongoDB
Chúng ta sẽ nhận được kết quả mong muốn vì chỉ có một tài liệu lồng nhau trong mảng
$ docker exec -it mongo-server bash
$ mongosh "mongodb://admin:pass@localhost:27017"
9 có giá trị cho các kiểu CPUBây giờ hãy tìm tất cả các máy tính xách tay có bộ nhớ 16GB. Theo trực giác, bạn có thể muốn sử dụng một truy vấn như thế này
Khi truy vấn trên được thực thi, có vẻ như tất cả các máy tính xách tay có bộ nhớ 16GB đều được trả về
Tuy nhiên, đây là nơi nhiều người mới bắt đầu sử dụng MongoDB mắc lỗi và là nơi một số lỗi được đưa vào mã của bạn. Nếu bạn nhập “it” vào
$ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
6 để hiển thị thêm kết quả hoặc chỉ cần cuộn xuống gần cuối trang kết quả bằng IDE và kiểm tra kỹ, bạn sẽ thấy điều gì đó kỳ lạChúng tôi nhận được các máy tính xách tay có dung lượng lưu trữ là 16GB với truy vấn trên. Điều này là do truy vấn trên tìm các tài liệu trong đó mảng
$ docker exec -it mongo-server bash
$ mongosh "mongodb://admin:pass@localhost:27017"
9 có ít nhất một tài liệu được nhúng chứa trường $ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
4 bằng với $ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
5 và ít nhất một tài liệu được nhúng [nhưng không nhất thiết phải là cùng một tài liệu được nhúng] chứa trường $ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
6 bằng với $ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
7Vì tất cả các mảng
$ docker exec -it mongo-server bash
$ mongosh "mongodb://admin:pass@localhost:27017"
9 đều có một tài liệu nhúng có $ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
4 là $ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
5, nên truy vấn trên đã sử dụng kết quả sai. Điều chúng tôi muốn là cả hai điều kiện phải được thỏa mãn cho cùng một tài liệu được nhúng. Để đạt được điều này, chúng ta không thể truy vấn bằng ký hiệu dấu chấm như hình trên mà cần sử dụng toán tử $ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
5Đợt này các laptop có dung lượng lưu trữ 16GB nhưng bộ nhớ không phải 16GB sẽ không được trả lại. Nếu không tin, bạn có thể đếm số lượng tài liệu được trả về bởi cả hai truy vấn
Bây giờ, hãy thử một trường hợp thậm chí còn phức tạp hơn và tìm tất cả các máy tính xách tay có bộ nhớ 16GB và dung lượng lưu trữ là 1TB. Chúng tôi sẽ cần sử dụng toán tử
$ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
42 để chỉ định các điều kiện cho hai tài liệu lồng nhau, điều này rất giống với việc sử dụng các từ khóa $ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
43 và $ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
44 trong Elaticsearch cho truy vấn các tài liệu lồng nhauTruy vấn này sẽ trả về kết quả chúng ta muốn
Lưu ý rằng mặc dù toán tử
$ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
42 là toán tử mặc định trong MongoDB, nhưng nó là bắt buộc ở đây vì chúng tôi đang truy vấn cùng một trường trong hai điều kiện khác nhau. Nếu không, chúng tôi sẽ chỉ truy vấn theo điều kiện thứ hai và sẽ nhận được kết quả không chính xácBạn sẽ nhận được một kết quả không chính xác trong trường hợp này. Nếu bạn thử với các điều kiện khác, bạn sẽ nhận được nhiều kết quả sai hơn
Khi bạn biết cách truy vấn một mảng với các tài liệu lồng nhau, việc cập nhật nó sẽ khá dễ dàng. Lưu ý rằng các tài liệu lồng nhau được sắp xếp theo thứ tự trong mảng và do đó bạn có thể truy cập tài liệu lồng nhau theo vị trí chỉ mục
Hãy cập nhật bộ nhớ lên 16GB cho máy tính xách tay với
$ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
46 bằng 1Nếu chúng tôi kiểm tra máy tính xách tay này ngay bây giờ, các thuộc tính của nó đã được cập nhật
Ở đây chúng tôi sử dụng phép chiếu để chỉ hiển thị trường
$ docker exec -it mongo-server bash
$ mongosh "mongodb://admin:pass@localhost:27017"
9 của tài liệuChúc mừng. Tài liệu lồng nhau được cập nhật thành công
Trong bài đăng này, chúng tôi đã giới thiệu cách truy vấn và cập nhật một mảng các tài liệu lồng nhau trong MongoDB. Đây là một cách sử dụng nâng cao nhưng rất phổ biến trong thực tế. Tôi chắc rằng bạn khá tự tin khi làm việc với loại vấn đề này trong công việc của bạn bây giờ