Phép chiếu MongoDB

Mongo DB là một cơ sở dữ liệu định hướng tài liệu mã nguồn mở và NoSQL phổ biến, cho phép cấu trúc tài liệu linh hoạt và có khả năng mở rộng cao. Nó nhanh hơn RDBMS do các kỹ thuật lập chỉ mục và lưu trữ hiệu quả và là một giải pháp NoQuery, nó được thiết kế để xử lý một lượng lớn dữ liệu. Lý do MongoDB được sử dụng rộng rãi, nếu bạn muốn tận dụng tối đa công cụ này, hãy kiểm tra chứng chỉ chuyên nghiệp MongoDB.  

Mặc dù khi bạn muốn tìm nạp thông tin có chọn lọc từ một số lượng lớn bản ghi, MongoDB sẽ xử lý rất nhiều dữ liệu không cần thiết, đồng thời gây áp lực lớn lên hiệu suất tổng thể của cơ sở dữ liệu. Để khắc phục những vấn đề như vậy, MongoDB cung cấp một tính năng đặc biệt được gọi là Phép chiếu MongoDB

Phép chiếu MongoDB là gì?

MongoDB Projection là một tính năng đặc biệt cho phép bạn chỉ chọn những dữ liệu cần thiết thay vì chọn toàn bộ dữ liệu từ tài liệu. Ví dụ: Nếu Tài liệu chứa 10 trường và chỉ có 5 trường được hiển thị thì có thể đạt được điều tương tự bằng cách sử dụng Phép chiếu.  

Điều này sẽ cho phép chúng tôi.  

  • Dự án dữ liệu ngắn gọn nhưng minh bạch
  • Lọc dữ liệu mà không ảnh hưởng đến hiệu suất cơ sở dữ liệu tổng thể

Hãy để chúng tôi kiểm tra một ví dụ để hiểu rõ hơn về cách hoạt động của phép chiếu.  

Đầu tiên, hãy làm quen với cách MongoDB lưu trữ dữ liệu, vì MongoDB không có lược đồ nên lưu trữ dữ liệu trong các tài liệu riêng biệt, ở đây bảng được ký hiệu là "Bộ sưu tập", một hàng là "Tài liệu" và cột có nghĩa là "Trường"

Hãy xem xét bộ sưu tập sau đây cho một ví dụ về phép chiếu MongoDB, trong đó chúng tôi có một bộ dữ liệu về kho kiến ​​thức của KnowledgeHut với một số tài liệu và trường được liên kết với chúng.  

Khi chúng tôi sử dụng lệnh find, chúng tôi tìm nạp tất cả tập dữ liệu từ bộ sưu tập như sau.  

db.knowledgeHutCollection.find().pretty() 
What is MongoDB Projection?

Ở đây chúng tôi đang tìm nạp tất cả dữ liệu mà DB của chúng tôi có mà không có bộ lọc. Ở phần sau của bài viết, chúng ta sẽ làm việc trên cùng một tập dữ liệu để thực hiện Phép chiếu MongoDB, nhưng bây giờ, trước tiên chúng ta hãy hiểu cách thức hoạt động của Phép chiếu.  

Phép chiếu MongoDB hoạt động như thế nào?

Các phép chiếu MongoDB được xây dựng dựa trên truy vấn find() hiện có và do đó giúp sử dụng dễ dàng hơn mà không cần sửa đổi đáng kể các chức năng/truy vấn hiện có. Hơn nữa, phép chiếu đóng vai trò quan trọng khi tìm kiếm dữ liệu lấy người dùng làm trung tâm từ một tập dữ liệu lớn nhất định

Cú pháp mẫu mà bạn có thể sử dụng để truy xuất lượng dữ liệu hạn chế bằng Phép chiếu trong MongoDB có thể được viết như sau.  

cú pháp

db.DATA_COLLECTION_NAME.find({}, {YOUR_FIELD_KEY: BOOLEAN}) 

Hãy để chúng tôi chia nhỏ cú pháp này để hiểu mọi thứ một cách chi tiết.  

  • Ở đây "DATA_COLLECTION_NAME" là tên của bảng/Bộ sưu tập từ đó các bản ghi sẽ được truy xuất để xử lý.  
  • YOUR_FIELD_KEY là tên của cột hoặc mục dữ liệu mà bạn muốn xử lý từ Bộ sưu tập
  • BOOLEAN là dấu kiểm để hiển thị hoặc ẩn giá trị Trường.  

Hãy để chúng tôi lấy ví dụ về knowledgeHutCollection mà chúng tôi đã thảo luận ở trên để hiểu độ sâu của phép chiếu bằng cách xử lý một số dữ liệu

Chúng tôi đã viết một truy vấn cho ví dụ phép chiếu MongoDB sẽ truy xuất tất cả các bản ghi có sẵn trong bộ sưu tập đã chọn ở định dạng có thể đọc được với sự trợ giúp của pretty(), bạn có thể tìm lại truy vấn tương tự bên dưới.  

db. kiến thứcHutCollection. tìm thấy(). đẹp()

Bây giờ chúng ta sẽ sử dụng Phép chiếu trên tài liệu này để chỉ định hoặc hạn chế các trường trả về. Nếu muốn trả lại tất cả các trường từ tất cả các tài liệu trong bộ sưu tập hàng tồn kho có trạng thái bằng "A", truy vấn sẽ giống như bên dưới.  

db.knowledgeHutCollection.find( { status: "A" } ) 

Kết quả sẽ giống như mục bên dưới.  

What is MongoDB Projection?

Để dễ hiểu thao tác này có thể hiểu như câu lệnh SQL sau.  

CHỌN * từ kiến ​​thứcHutCollection WHERE status = "A"

Mặc dù có nhiều điều chúng ta có thể làm với các phép chiếu, nhưng giả sử chúng ta chỉ muốn lấy một số trường liên quan từ tài liệu, Một phép chiếu cũng có thể kèm theo một cách rõ ràng một số trường bằng cách đặt theto 1 trong tài liệu phép chiếu

db.inventory.find( { status: "A" }, { item: 1, status: 1, _id: 0 } ) 

Trong tập hợp kết quả cho truy vấn trên, chỉ các trường mục và trạng thái được trả về trong các tài liệu phù hợp trong khi trường _id bị Bỏ qua

What is MongoDB Projection?

Tương tự, thao tác này có thể được hiểu như câu lệnh SQL sau.  

CHỌN mục, trạng thái từ kiến ​​thứcHutCollection WHERE status = "A"

Chứng chỉ quản trị MongoDB có thể giúp bạn hiểu thêm về Lưu trữ dữ liệu và các chức năng khác liên quan đến MongoDB.  

Toán tử chiếu MongoDB

Phương pháp chiếu MongoDB tác động tích cực đến hiệu suất cơ sở dữ liệu vì nó giảm khối lượng công việc của truy vấn tìm kiếm khi cố truy xuất dữ liệu cụ thể từ tài liệu, giảm thiểu việc sử dụng tài nguyên.  

Để tăng cường truy vấn và giảm khối lượng công việc, nhiều toán tử có thể được sử dụng trong một truy vấn chiếu như các truy vấn bên dưới.  

Hãy để chúng tôi đi sâu vào để hiểu sâu từng người.  

1. $ Toán tử

Toán tử $ được sử dụng trong các tình huống cần giới hạn một mảng để chỉ chiếu phần tử đầu tiên khớp với điều kiện của truy vấn, nếu không có điều kiện truy vấn nào, phần tử đầu tiên được trả về trong mảng chiếu MongoDB đã chỉ định và .  

db.collection.find( { :  .. }, { ".$": 1 } ) 

Thí dụ

Hãy cùng chúng tôi xem Bộ sưu tập "sinh viên" lần này để hiểu hoạt động của toán tử $.  

What is MongoDB Projection?
db.students.find( { semester: 1, grades: { $gte: 85 } }, { "grades.$": 1 } ) 

Sử dụng toán tử $ sẽ chỉ trả về phần tử đầu tiên của phép chiếu MongoDB của mảng trong đó nó bằng hoặc lớn hơn 85.  

What is MongoDB Projection?

Hạn chế của toán tử $.  

  • Trong một truy vấn phép chiếu MongoDB duy nhất, chỉ có thể sử dụng một toán tử $ duy nhất.  
  • Nó sẽ chỉ được áp dụng cho một điều kiện duy nhất trên trường mảng
  • Hàm sort() trong find() được áp dụng trước toán tử $ và hàm này có thể khiến thứ tự sắp xếp bị sai lệch.  
  • Toán tử $ chỉ có thể được sử dụng ở cuối đường dẫn trường. Hạn chế này giúp giảm thiểu mọi vấn đề về định dạng.  

2. Toán tử $elemMatch

Tương tự như toán tử $, toán tử $elemMatch cũng giới hạn nội dung của một mảng đối với phần tử đầu tiên phù hợp với ràng buộc đã cho. Mặc dù vậy, có một sự khác biệt nhỏ so với toán tử $ bởi vì toán tử chiếu $elemMatch cần một đối số điều kiện rõ ràng.  

Cú pháp như sau.   

db.collection.find( { :  .. }, { ".$elemMatch": ($elemMatch operator) } ) 

Thí dụ

Bên dưới, bạn có thể kiểm tra bộ sưu tập "schoolsdData" mà chúng tôi sẽ sử dụng để minh họa toán tử $elemMatch.  

What is MongoDB Projection?

Chúng ta cần viết một thao tác trả về các tài liệu sau có mã zip bằng `63109` và chiếu mảng sinh viên bằng cách sử dụng $elemMatch.  

db.schools.find( { zipcode: "63109" }, { students: { $elemMatch: { school: 102 } } } ) 
What is MongoDB Projection?

Các hạn chế của toán tử $elemMatch như sau.

  • Trường áp dụng phép chiếu $elemMatch được trả về là trường cuối cùng của tài liệu, bất kể thứ tự các trường được sắp xếp.  
  • Toán tử chiếu $elemMatch không được hỗ trợ bởi các thao tác find() trên các khung nhìn MongoDB.  
  • Toán tử $elemMatch không xử lý các biểu thức truy vấn $text.  

3. Toán tử chiếu $slice

Toán tử $slice giới hạn số lượng phần tử sẽ được trả về dưới dạng đầu ra của truy vấn phép chiếu MongoDB.  

cú pháp.  

________số 8

Bây giờ chúng ta sẽ sử dụng bộ sưu tập "postsData" để minh họa toán tử $slice.  

What is MongoDB Projection?

Chúng tôi muốn lấy dữ liệu từ mảng nhận xét để trả về mảng có ba phần tử đầu tiên. Nếu mảng chứa ít hơn ba phần tử, tất cả các phần tử của mảng được trả về.  

db.posts.find( {}, { comments: { $slice: 3 } } ) 
What is MongoDB Projection?

Hạn chế trong toán tử $slice.

  • Trong một mảng lồng nhau, toán tử $slice sẽ chỉ trả về phần tử được cắt lát và sẽ không trả về bất kỳ mục nào khác, đặc biệt là từ MongoDB 4. 4.  
  • Hành động find() không được toán tử $slice hỗ trợ trên các khung nhìn MongoDB.  
  • Do một ràng buộc do MongoDB áp đặt, toán tử $slice không thể được kết hợp với toán tử chiếu $. Điều này là do các trường cấp cao nhất không được phép chứa ký hiệu $ như một phần của tên trường.  

4. Toán tử $meta với các ví dụ

Toán tử $meta cung cấp cho chúng tôi khả năng trích xuất siêu dữ liệu được liên kết với tài liệu. Cả Phép chiếu và Tập hợp MongoDB đều hỗ trợ toán tử $meta, tuy nhiên bây giờ chúng ta hãy đi sâu vào Phép chiếu.  

Toán tử $meta sử dụng cú pháp sau.  

db.DATA_COLLECTION_NAME.find({}, {YOUR_FIELD_KEY: BOOLEAN}) 
0

"MetaDataKeyword", đại diện cho các giá trị này.  

  • Từ khóa "textScore". Từ khóa này tìm thấy một cách hiệu quả mức độ chính xác của cụm từ tìm kiếm có liên quan với trường đã cho trong tài liệu. "textScore" mang lại điểm số được liên kết với $text được cung cấp
  • Từ khóa "indexKey". Được giới thiệu trong MongoDB 4. 4 như một sự thay thế ưa thích cho con trỏ. hàm returnKey(). Đối với tài liệu sử dụng chỉ mục không phải văn bản, hàm này trả về khóa chỉ mục. Một điều quan trọng cần lưu ý là từ khóa này không nên được sử dụng trong các tình huống sản xuất; .  

Bây giờ, hãy xem xét một số ví dụ về phép chiếu MongoDB của toán tử $meta.  

Đối với {$meta. "textScore"}, chúng tôi sẽ sử dụng bộ sưu tập bài viết như bên dưới.  

What is MongoDB Projection?

Trước tiên, chúng tôi thêm một chỉ mục vào Tài liệu và sau đó chúng tôi sử dụng toán tử meta textScore để bao gồm điểm số được gán cho từng tài liệu phù hợp.  

db.DATA_COLLECTION_NAME.find({}, {YOUR_FIELD_KEY: BOOLEAN}) 
1What is MongoDB Projection?

Cách sử dụng và Hạn chế của toán tử $meta trong phép chiếu.

  • {$meta. Biểu thức "$textScore"} được sử dụng trong truy vấn phép chiếu để lấy điểm văn bản. Biểu thức có thể được thiết lập dưới dạng bao gồm hoặc loại trừ trong câu lệnh chiếu. Hạn chế đi kèm với nó là nếu biểu thức được đặt thành một trường hiện có, giá trị siêu dữ liệu dự kiến ​​sẽ bị ghi đè bởi giá trị hiện tại trong trường.  
  • Biểu thức $meta khi được ghép nối với hàm sort() cũng sẽ sắp xếp siêu dữ liệu "textScore" theo thứ tự giảm dần.  
  • Cả thủ tục chiếu và sắp xếp đều có thể sử dụng tên trường khác cho biểu thức khi $meta. "$textScore" được sử dụng. Hệ thống truy vấn sẽ bỏ qua tên trường sắp xếp ().  

Truy vấn phép chiếu với các ví dụ

Chúng ta hãy xem xét một số truy vấn phép chiếu ví dụ trong phần này

Không chỉ định các trường trong truy vấn tương tự như CHỌN * trong SQL. Nếu bạn chỉ muốn trả về một tập hợp con các trường, bạn sẽ chỉ định chúng trong mệnh đề CHỌN như bên dưới.  

CHỌN Id, tên, is_active TỪ khách hàng

Điều này tương tự như trả về tất cả các trường trong Tài liệu phù hợp giống như một trong các truy vấn trên

db.DATA_COLLECTION_NAME.find({}, {YOUR_FIELD_KEY: BOOLEAN}) 
2

Hãy để chúng tôi kiểm tra một số ví dụ khác để hiểu các biến thể trong truy vấn

1. Chỉ trả lại các trường được chỉ định

Trong trường hợp bạn chỉ cần trả lại các trường đã chỉ định từ một tài liệu, một số trường có thể được đưa vào một phép chiếu bằng cách đặt theto 1 trong tài liệu phép chiếu

Một ví dụ chiếu MongoDB tốt có thể là Truy vấn bên dưới

db.DATA_COLLECTION_NAME.find({}, {YOUR_FIELD_KEY: BOOLEAN}) 
3

Tập hợp kết quả được liên kết với truy vấn này sẽ chỉ chứa các trường mục, trạng thái và _id (theo mặc định) trong các tài liệu phù hợp.  

2. Trả lại tất cả các trường ngoại trừ bị loại trừ

Tương tự, khi bạn muốn xóa hoặc chặn các trường trả về trong tài liệu phù hợp, các phép chiếu có thể được sử dụng để loại trừ các trường cụ thể. Ví dụ sau sẽ hiển thị tất cả các trường ngoại trừ trạng thái và các trường trong kho trong các tài liệu tương ứng.  

db.DATA_COLLECTION_NAME.find({}, {YOUR_FIELD_KEY: BOOLEAN}) 
4

4. Trả lại các trường được chỉ định trong tài liệu được nhúng

Trong một tài liệu được nhúng, một số trường nhất định có thể được trả về theo nhu cầu của tập kết quả. Để làm như vậy, hãy đặt trường nhúng trong tài liệu chiếu thành 1 và sử dụng ký hiệu dấu chấm để tham chiếu đến trường đó.  

Ví dụ sau trả về.  

  • Trường _id (được trả về theo mặc định),
  • Trường mục,
  • Trường uom trong tài liệu kích thước.  
db.DATA_COLLECTION_NAME.find({}, {YOUR_FIELD_KEY: BOOLEAN}) 
5

Bắt đầu từ MongoDB 4. 4, bạn cũng có thể chỉ định các trường được nhúng bằng cách sử dụng biểu mẫu lồng nhau, e. g. { mục. 1, trạng thái. 1, kích thước. { uôm. 1 } }.  

5. Trả về các trường được chỉ định trong một tài liệu được nhúng trong một mảng

Để trả về các trường cụ thể ở định dạng mảng, bạn có thể sử dụng ký hiệu dấu chấm để lấy các trường dành riêng cho dự án từ bên trong các tài liệu được nhúng trong một mảng.  

Hãy để chúng tôi lấy ví dụ này chỉ định một phép chiếu để trả về.  

  • Trường _id (Giá trị mặc định),
  • Trường mục,
  • Trường qty, nghĩa là được nhúng trong mảng instock.  

Truy vấn tương tự đối với bộ sưu tập hàng tồn kho sẽ như sau.  

db.DATA_COLLECTION_NAME.find({}, {YOUR_FIELD_KEY: BOOLEAN}) 
6

Sự kết luận

Phép chiếu hơi giống với việc sử dụng tên cột một cách rõ ràng trong SQL. Lý do có vẻ hơi phản trực giác khi sử dụng chúng để trả về một lượng dữ liệu nhỏ hơn và khi cơ sở dữ liệu của bạn phát triển, bạn có thể kiểm soát những gì bạn đang mang về với mỗi thao tác đọc/ghi thành công và do đó cải thiện hiệu suất.  

Chúng tôi hy vọng bài viết này sẽ làm sáng tỏ khái niệm về các phép chiếu trong MongoDB và cách sử dụng chúng để tạo các truy vấn MongoDB hiệu quả. Chứng nhận chuyên nghiệp MongoDB của KnowledgeHut bao gồm MongoDB Projection chuyên sâu.  

Câu hỏi thường gặp (FAQ)

1. Trình chiếu MongoDB có cải thiện hiệu suất không?

Có, Phép chiếu giúp giới hạn các trường trả về từ kết quả truy vấn, điều này có thể cải thiện hiệu suất vì những lý do sau.  

  1. xóa các trường không cần thiết khỏi kết quả truy vấn giúp tiết kiệm băng thông mạng.  
  2. Do đó, nó giới hạn các trường kết quả để đạt được truy vấn được bảo hiểm, trả về kết quả truy vấn được lập chỉ mục mà không tìm nạp tài liệu đầy đủ.  

2. Phép chiếu được sử dụng như thế nào trong la bàn MongoDB?

Để đặt phép chiếu trong MongoDB Compass, hãy sử dụng các bước bên dưới

  1. Trong Thanh truy vấn, bấm Tùy chọn.  
  2. Nhập tài liệu chiếu vào trường Dự án. Để bao gồm các lĩnh vực.  
  3. Nhấp vào Tìm để chạy truy vấn và xem kết quả cập nhật. Đối với các tập hợp kết quả truy vấn lớn hơn 1000 tài liệu, La bàn hiển thị một mẫu kết quả.  

3. Làm cách nào để chiếu một mảng trong MongoDB?

Đối với các trường chứa mảng, MongoDB cung cấp các toán tử chiếu sau để thao tác với mảng. $elemMatch, $slice và $.  

$elemMatch, $slice và $ là cách duy nhất cho các phần tử dành riêng cho dự án được bao gồm trong mảng được trả về.  

4. Làm cách nào để tìm dữ liệu cụ thể trong MongoDB?

Có các chức năng và truy vấn mà chúng ta có thể sử dụng để tìm dữ liệu cụ thể trong Tài liệu MongoDB, đáng chú ý là Find() và FindOne(), Ngoài ra, các phép chiếu có thể được sử dụng để tìm dữ liệu cụ thể trong Tài liệu.  

Phép chiếu trong MongoDB là gì?

MongoDB Projection là một tính năng đặc biệt cho phép bạn chỉ chọn dữ liệu cần thiết thay vì chọn toàn bộ tập hợp dữ liệu từ tài liệu . Ví dụ: Nếu Tài liệu chứa 10 trường và chỉ có 5 trường được hiển thị thì có thể đạt được điều tương tự bằng cách sử dụng Phép chiếu.

Sự khác biệt giữa nhóm và dự án trong MongoDB là gì?

$group được sử dụng để nhóm các tài liệu đầu vào theo biểu thức _id đã chỉ định và đối với mỗi nhóm riêng biệt, xuất ra một tài liệu. $project được sử dụng để chuyển các tài liệu có các trường được yêu cầu sang giai đoạn tiếp theo trong quy trình

__ V trong MongoDB là gì?

__ V trong bộ sưu tập MongoDB là gì? . 24 Tháng Sáu, 2021. Trong Mongoose, trường “_v” là versionKey là thuộc tính được đặt trên mỗi tài liệu khi được Mongoose tạo lần đầu . Đây là một tài liệu được chèn qua mongo shell trong một bộ sưu tập và khóa-giá trị này chứa bản sửa đổi nội bộ của tài liệu. 24-Jun-2021.