Tìm đối tượng lồng nhau MongoDB

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ơn

Hì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 cao

Dữ 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ập

Các điểm chính cho đoạn mã trên

  • Chúng tôi sử dụng
    $ docker exec -it mongo-server bash
    $ mongosh "mongodb://admin:pass@localhost:27017"
    1 để khai báo một cơ sở dữ liệu MongoDB có tên là
    $ docker exec -it mongo-server bash
    $ mongosh "mongodb://admin:pass@localhost:27017"
    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 đó
  • Dữ liệu JSON được tải bằng lệnh
    $ docker exec -it mongo-server bash
    $ mongosh "mongodb://admin:pass@localhost:27017"
    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
    $ docker exec -it mongo-server bash
    $ mongosh "mongodb://admin:pass@localhost:27017"
    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à
    $ docker exec -it mongo-server bash
    $ mongosh "mongodb://admin:pass@localhost:27017"
    5
  • Phương pháp
    $ docker exec -it mongo-server bash
    $ mongosh "mongodb://admin:pass@localhost:27017"
    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
    $ docker exec -it mongo-server bash
    $ mongosh "mongodb://admin:pass@localhost:27017"
    7 được sử dụng để hiển thị tài liệu đầu tiên trong bộ sưu tập

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ản

Trướ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àng

Lư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 CPU

Bâ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:/
7

Vì 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 nhau

Truy 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ác

Bạ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 1

Nế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ệu

Chú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ờ

Làm cách nào để tìm các đối tượng lồng nhau trong MongoDB?

Truy cập tài liệu nhúng/lồng nhau – . using dot notation and when you are using dot notation, then the field and the nested field must be inside the quotation marks.

Làm cách nào để tìm kiếm bên trong mảng trong MongoDB?

Để truy vấn xem trường mảng có chứa ít nhất một phần tử có giá trị được chỉ định hay không, hãy sử dụng bộ lọc { . Để chỉ định điều kiện cho các phần tử trong trường mảng, hãy sử dụng các toán tử truy vấn trong tài liệu bộ lọc truy vấn. {

$or trong MongoDB là gì?

MongoDB cung cấp các loại toán tử truy vấn logic khác nhau và toán tử $or là một trong số đó. Toán tử này được sử dụng để thực hiện phép toán OR logic trên mảng gồm hai biểu thức trở lên và chỉ chọn hoặc truy xuất những tài liệu khớp với ít nhất một trong các biểu thức đã cho trong mảng.

Làm cách nào để chèn tài liệu lồng nhau trong MongoDB?

Như chúng ta biết rằng trong mongo shell, các tài liệu được biểu diễn bằng dấu ngoặc nhọn ( {} ) và bên trong các dấu ngoặc nhọn này, chúng ta có các cặp trường-giá trị. Bây giờ bên trong các trường này, chúng ta có thể nhúng tài liệu khác bằng cách sử dụng dấu ngoặc nhọn {} và tài liệu này có thể chứa các cặp giá trị trường hoặc tài liệu phụ khác.