MongoDB - Projection

Xin chào các bạn future database wizards! Hôm nay, chúng ta sẽ cùng lặn vào thế giới kỳ diệu của MongoDB projection. Đừng lo lắng nếu bạn mới bắt đầu học lập trình - tôi sẽ hướng dẫn bạn qua khái niệm này từng bước một, giống như tôi đã làm cho hàng trăm học sinh trong những năm dạy học của mình. Nào, hãy lấy một ly đồ uống yêu thích của bạn, và cùng nhau bắt đầu hành trình thú vị này nhé!

MongoDB - Projection

Projection trong MongoDB là gì?

Trước khi chúng ta đi vào chi tiết, hãy hiểu projection có nghĩa là gì trong ngữ cảnh của MongoDB. Hãy tưởng tượng bạn có một thư viện khổng lồ (database của bạn) với hàng ngàn cuốn sách (documents của bạn). Bây giờ, giả sử bạn chỉ muốn biết tiêu đề của những cuốn sách này mà không cần mang theo toàn bộ cuốn sách. Đó chính xác là điều projection làm trong MongoDB - nó cho phép bạn lấy chỉ các trường cụ thể bạn cần từ documents của mình.

Phương thức find()

Tại tâm của việc truy vấn trong MongoDB là phương thức find(). Phương thức nhỏ bé này là thứ chúng ta sử dụng để lấy documents từ một collection. Nhưng khi kết hợp với projection, nó trở nên mạnh mẽ hơn. Hãy cùng xem nhé!

Cú pháp cơ bản

Cú pháp cơ bản của phương thức find() với projection trông như thế này:

db.collection.find(query, projection)

Ở đây, query xác định哪些 documents để trả về, và projection xác định哪些 trường để trả về từ những documents đó.

Bao gồm các trường

Hãy bắt đầu với một ví dụ đơn giản. Giả sử chúng ta có một collection của học sinh, và chúng ta chỉ muốn lấy tên và tuổi của họ. Dưới đây là cách chúng ta làm:

db.students.find({}, { name: 1, age: 1 })

Trong ví dụ này:

  • {} trống là một truy vấn trống, có nghĩa là chúng ta muốn tất cả các documents.
  • { name: 1, age: 1 } là projection của chúng ta. 1 có nghĩa là chúng ta muốn bao gồm các trường này.

Truy vấn này sẽ trả về điều gì đó như sau:

[
{ "_id": ObjectId("..."), "name": "Alice", "age": 20 },
{ "_id": ObjectId("..."), "name": "Bob", "age": 22 },
...
]

Chú ý rằng trường _id luôn được bao gồm mặc định. Nó giống như một người bạn không mời mà đến trong các buổi tiệc!

Loại trừ các trường

Bây giờ, giả sử chúng ta muốn loại trừ một số trường thay vì bao gồm chúng? Chúng ta cũng có thể làm được! Hãy nói rằng chúng ta muốn tất cả các trường ngoại trừ bí danh siêu anh hùng của học sinh:

db.students.find({}, { superhero_identity: 0 })

Ở đây, 0 có nghĩa là chúng ta muốn loại trừ trường này. Truy vấn này sẽ trả về tất cả các trường cho mỗi document ngoại trừ superhero_identity.

Kết hợp bao gồm và loại trừ

Đây là một sự thật thú vị: bạn không thể kết hợp 1s và 0s trong projection của bạn, ngoại trừ trường _id. Nó giống như cố gắng trộn dầu và nước - nó simply không hoạt động! MongoDB muốn bạn rõ ràng về việc bạn đang bao gồm hay loại trừ các trường.

Loại trừ _id

Nhớ lại người bạn không mời _id của chúng ta? Đôi khi chúng ta có thể muốn cho họ ra khỏi cửa. Dưới đây là cách:

db.students.find({}, { name: 1, age: 1, _id: 0 })

Điều này sẽ cho chúng ta chỉ có tên và tuổi, không có _id:

[
{ "name": "Alice", "age": 20 },
{ "name": "Bob", "age": 22 },
...
]

Kỹ thuật Projection Nâng cao

Bây giờ chúng ta đã覆盖 các kỹ thuật cơ bản, hãy cùng xem xét một số kỹ thuật nâng cao. Những kỹ thuật này giống như những pháp thuật bí mật trong sổ pháp thuật của một phù thủy MongoDB!

Projecting trên các Document嵌入式

Hãy tưởng tượng mỗi document học sinh có một document嵌入式 cho địa chỉ của họ. Chúng ta có thể project trên các trường cụ thể trong document嵌入式 này:

db.students.find({}, { "name": 1, "address.city": 1 })

Điều này sẽ trả về tên học sinh và chỉ có thành phố từ địa chỉ của họ:

[
{ "_id": ObjectId("..."), "name": "Alice", "address": { "city": "Wonderland" } },
{ "_id": ObjectId("..."), "name": "Bob", "address": { "city": "Builderville" } },
...
]

Projecting trên các phần tử Mảng

Giả sử chúng ta có một mảng điểm cho mỗi học sinh và chúng ta chỉ muốn hai điểm đầu tiên? Chúng ta có thể sử dụng toán tử $slice:

db.students.find({}, { name: 1, scores: { $slice: 2 } })

Điều này sẽ trả về tên học sinh và chỉ có hai điểm đầu tiên:

[
{ "_id": ObjectId("..."), "name": "Alice", "scores": [95, 88] },
{ "_id": ObjectId("..."), "name": "Bob", "scores": [92, 78] },
...
]

Bảng tóm tắt các phương thức Projection

Dưới đây là bảng tóm tắt các phương thức projection chúng ta đã học:

Phương thức Mô tả Ví dụ
Bao gồm các trường Sử dụng 1 để bao gồm các trường cụ thể { name: 1, age: 1 }
Loại trừ các trường Sử dụng 0 để loại trừ các trường cụ thể { superhero_identity: 0 }
Loại trừ _id Đặt _id thành 0 để loại trừ nó { name: 1, _id: 0 }
Project trên các trường嵌入式 Sử dụng ký tự gạch ngang { "address.city": 1 }
Project trên các phần tử Mảng Sử dụng toán tử $slice { scores: { $slice: 2 } }

Kết luận

Và thế là bạn đã có nó, các học sinh yêu quý của tôi! Chúng ta đã cùng nhau hành trình qua vùng đất của MongoDB projection, từ các kỹ thuật cơ bản của việc bao gồm và loại trừ các trường đến các kỹ thuật nâng cao hơn khi làm việc với các document嵌入式 và mảng. Nhớ rằng, projection giống như một người mua sắm chọn lọc trong siêu thị cơ sở dữ liệu - bạn chỉ lấy những gì bạn cần, tiết kiệm thời gian và tài nguyên.

Khi bạn thực hành các kỹ thuật này, bạn sẽ thấy rằng projection là một công cụ vô cùng mạnh mẽ trong bộ công cụ MongoDB của bạn. Nó cho phép bạn định hình việc lấy dữ liệu chính xác theo nhu cầu của ứng dụng của bạn, làm cho các thao tác cơ sở dữ liệu của bạn hiệu quả hơn và mã của bạn sạch sẽ hơn.

Tiếp tục thử nghiệm, tiếp tục học hỏi, và quan trọng nhất, hãy vui vẻ với nó! Cuối cùng, niềm vui của khám phá là điều làm cho lập trình trở nên thú vị. Đến gặp lại lần sau, chúc các bạn lập trình vui vẻ!

Credits: Image by storyset