Làm cách nào để nắm bắt một trường cụ thể trong mongodb?

Giả sử chúng ta có một bộ sưu tập có nhiều dữ liệu trong một tài liệu. Chúng tôi có một bộ sưu tập

db.vehicleinformation.find({make : "Toyota"}, {year : 1}).pretty()
5. Chúng tôi sẽ chỉ chọn một vài lĩnh vực chúng tôi muốn,

Bây giờ, tôi chỉ muốn chọn trường

db.vehicleinformation.find({make : "Toyota"}, {year : 1}).pretty()
6 và chỉ hiển thị kết quả với trường
db.vehicleinformation.find({make : "Toyota"}, {year : 1}).pretty()
6

Để làm được điều đó, trước tiên chúng ta cần hiểu cú pháp truy vấn mongoDB

Bạn có thể truyền tham số thứ hai cho phương thức

db.vehicleinformation.find({make : "Toyota"}, {year : 1}).pretty()
8. Nó cũng sẽ hoạt động cho
db.vehicleinformation.find({make : "Toyota"}, {year : 1}).pretty()
9

Bây giờ, hãy chọn trường

db.vehicleinformation.find({make : "Toyota"}, {year : 1}).pretty()
6. Ở đây bạn cần học thêm một thủ thuật nữa, Key sẽ là trường bạn muốn chọn, còn giá trị thì sao? .
db.vehicleinformation.find({make : "Toyota"}, {year : 1, _id : 0}).pretty()
2 để bỏ chọn một trường

Hãy xem nó như một ví dụ

Chỉ chọn trường tên quốc gia

Ở đây chúng tôi chỉ chọn thành công trường

db.vehicleinformation.find({make : "Toyota"}, {year : 1}).pretty()
6. Chờ đợi?

theo mặc định, truy vấn mongo sẽ luôn bao gồm trường

db.vehicleinformation.find({make : "Toyota"}, {year : 1, _id : 0}).pretty()
4

Bỏ chọn bất kỳ trường nào

Hãy bỏ chọn trường

db.vehicleinformation.find({make : "Toyota"}, {year : 1, _id : 0}).pretty()
4, nó cũng giống như vậy,

Hy vọng bạn thấy loạt bài hướng dẫn này hữu ích. Tiếp theo chúng ta sẽ tìm hiểu sâu hơn về series này. Chia sẻ nó với các nhóm của bạn và học tập vui vẻ 🤗

Trong MongoDB, chúng ta sử dụng phương thức find() để lấy dữ liệu. Tuy nhiên, find() truy xuất tất cả các trường trong tài liệu mà không cần lọc

Phép chiếu MongoDB giải quyết vấn đề này bằng cách cho phép hàm find() được sử dụng với các đối số lọc dữ liệu, cho phép người dùng chỉ trích xuất các trường dữ liệu cần thiết từ tài liệu

Trong bài viết thực hành này, chúng tôi sẽ chỉ cho bạn

  • Cách thức hoạt động của phép chiếu
  • Cú pháp cơ bản
  • Toán tử chiếu
  • Và nhiều hơn nữa

(Bài viết này là một phần của Hướng dẫn MongoDB của chúng tôi. Sử dụng menu bên phải để điều hướng. )

Cách hoạt động của phép chiếu MongoDB

Phép chiếu MongoDB là một công cụ mạnh mẽ có thể được sử dụng để chỉ trích xuất các trường bạn cần từ tài liệu—không phải tất cả các trường. Nó cho phép bạn

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

Vì phép chiếu MongoDB được xây dựng dựa trên phương thức find() hiện có, nên bạn có thể sử dụng bất kỳ truy vấn phép chiếu nào mà không cần sửa đổi đáng kể các hàm hiện có. Ngoài ra, phép chiếu là yếu tố chính khi tìm dữ liệu dành riêng cho người dùng từ một tập dữ liệu nhất định

Cú pháp cơ bản của phép chiếu MongoDB

db.collection_name.find({},{ : })

Phép chiếu MongoDB sử dụng cú pháp tìm tương tự, nhưng chúng tôi cũng thêm một bộ tham số vào hàm tìm. Bộ tham số này thông báo cho phiên bản MongoDB về trường nào sẽ được trả về

Xem xét bộ sưu tập sau đây có tên là “thông tin phương tiện”

Làm cách nào để nắm bắt một trường cụ thể trong mongodb?

Chúng tôi sẽ cố gắng truy xuất năm kiểu dáng của chiếc xe do Toyota sản xuất (sản xuất. 'Toyota')

Câu lệnh find() bình thường

db.vehicleinformation.find({make : "Toyota"}).pretty()

Kết quả

Làm cách nào để nắm bắt một trường cụ thể trong mongodb?

Trong tuyên bố này, chúng tôi nhận được tất cả dữ liệu trong tài liệu nơi sản xuất là Toyota. Để chỉ lấy năm, chúng ta có thể sử dụng phép chiếu, như hình bên dưới

Tuyên bố chiếu MongoDB

db.vehicleinformation.find({make : "Toyota"}, {year : 1}).pretty()

Kết quả

Làm cách nào để nắm bắt một trường cụ thể trong mongodb?

Trong câu lệnh chiếu, chúng tôi sử dụng trường năm có giá trị Boolean 1 (True) để cho biết rằng chúng tôi chỉ yêu cầu trường “năm”. Hạn chế là MongoDB sẽ trả về ID đối tượng (_id) của mỗi tài liệu trừ khi chúng tôi chỉ định rõ ràng rằng chúng tôi không yêu cầu ID đối tượng

Câu lệnh chiếu MongoDB với “_id” bị loại trừ

db.vehicleinformation.find({make : "Toyota"}, {year : 1, _id : 0}).pretty()

Kết quả

Làm cách nào để nắm bắt một trường cụ thể trong mongodb?

Trong câu lệnh này, chúng tôi chuyển 0 làm toán tử Boolean để cho biết rằng chúng tôi không yêu cầu trường ID đối tượng

Toán tử trong MongoDB Projection

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

Để giảm khối lượng công việc, MongoDB cung cấp các toán tử bên dưới có thể được sử dụng trong truy vấn phép chiếu

  • $
  • $elemMatch
  • $lát
  • $meta

$ Toán tử

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

cú pháp

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

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

  • Chỉ có thể sử dụng một toán tử $ duy nhất trong một truy vấn
  • Truy vấn chỉ được bao gồm một điều kiện duy nhất trên trường mảng mà nó sẽ được áp dụng
  • Hàm sort() trong phương thức find() sẽ được áp dụng trước toán tử $. Chức năng này có thể khiến thứ tự sắp xếp không được thể hiện chính xác
  • Toán tử $ chỉ có thể được áp dụng ở cuối đường dẫn trường. Hạn chế này đã được giới thiệu trong MongoDB 4. 4 để giảm thiểu mọi vấn đề về định dạng
  • Không thể sử dụng biểu thức phép chiếu $slice với toán tử $ như một phần của cùng một biểu thức

Chúng tôi sẽ sử dụng Bộ sưu tập “studentgrades” để chứng minh toán tử $

db.studentgrades.find({},{_id:0}).pretty()

Kết quả

Làm cách nào để nắm bắt một trường cụ thể trong mongodb?

Sử dụng bộ sưu tập “điểm của học sinh”, chúng tôi tìm kiếm xem một học sinh đã nhận được điểm bằng hoặc lớn hơn 80

Hãy xem điều gì sẽ xảy ra khi chúng ta không sử dụng toán tử $. Đoạn mã dưới đây sẽ dẫn đến truy vấn trả về tất cả các giá trị trong mảng dưới dạng đầu ra nếu bất kỳ mục nào bằng hoặc lớn hơn 80

db.studentgrades.find( {grades: { $gte: 80}}, {"grades": 1})

Kết quả

Làm cách nào để nắm bắt một trường cụ thể trong mongodb?

Sử dụng toán tử $ sẽ chỉ trả về mục đầu tiên có giá trị bằng hoặc lớn hơn 80

db.studentgrades.find( {grades: { $gte: 80}}, {"grades.$": 1})

Kết quả

Làm cách nào để nắm bắt một trường cụ thể trong mongodb?

Toán tử $elemMatch

Toán tử $elemMatch sẽ giới hạn nội dung của một mảng đối với phần tử đầu tiên khớp với một điều kiện nhất định. Điều kiện này khác với toán tử $ vì toán tử chiếu $elemMatch yêu cầu một đối số điều kiện rõ ràng

Hãy xem cú pháp sử dụng $elemMatch trong phương thức find()

cú pháp

________số 8

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

  • Bất kể thứ tự của các trường trong tài liệu, trường mà phép chiếu $elemMatch được áp dụng sẽ được trả về là trường cuối cùng của tài liệu
  • các thao tác find() được thực hiện trên các khung nhìn MongoDB không hỗ trợ toán tử phép chiếu $elemMatch
  • biểu thức truy vấn $text không được hỗ trợ với toán tử $elemMatch

Chúng tôi sẽ sử dụng bộ sưu tập “schooldata” sau đây để chứng minh toán tử $elemMatch

db.schooldata.find()

Kết quả

Làm cách nào để nắm bắt một trường cụ thể trong mongodb?

Bây giờ chúng tôi sẽ chạy cái này trên một trường duy nhất. Với toán tử $elemMatch, chúng tôi sẽ tìm kiếm các trường học ở London có học sinh mười tuổi. Phương thức pretty() được sử dụng để định dạng đầu ra

db.vehicleinformation.find({make : "Toyota"}).pretty()
0

Kết quả

Làm cách nào để nắm bắt một trường cụ thể trong mongodb?

Trong ví dụ dưới đây, chúng tôi sẽ kiểm tra nhiều trường. Ở đây, chúng tôi kiểm tra cả tuổi và tên của học sinh. Chúng tôi kiểm tra xem một học sinh tên là “barry” mười tuổi có đang học trường nào ở London không

db.vehicleinformation.find({make : "Toyota"}).pretty()
1

Kết quả

Làm cách nào để nắm bắt một trường cụ thể trong mongodb?

Toán tử chiếu $slice

Toán tử $slice chỉ định số phần tử sẽ được trả về làm đầu ra của truy vấn

cú pháp

db.vehicleinformation.find({make : "Toyota"}).pretty()
2

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

  • Với sự ra đời của MongoDB 4. 4, toán tử $slice sẽ chỉ trả về phần tử được cắt lát. Nó sẽ không trả về bất kỳ mục nào khác trong một mảng lồng nhau
  • Toán tử $slice không hỗ trợ thao tác find() được thực hiện trên các khung nhìn MongoDB
  • Toán tử $slice không thể được sử dụng cùng với toán tử chiếu $ do hạn chế của MongoDB, trong đó các trường cấp cao nhất không thể bao gồm $ (ký hiệu đô la) như một phần của tên trường
  • Các truy vấn không được chứa $slice của một mảng và một trường được nhúng trong mảng như một phần của cùng một câu lệnh để loại bỏ xung đột đường dẫn khỏi MongoDB 4. 4

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

db.schooldata.find()

Kết quả

Làm cách nào để nắm bắt một trường cụ thể trong mongodb?

Hãy cắt phần tử đầu tiên trong một mảng. Để đạt được kết quả này, chúng tôi sử dụng toán tử $slice để chỉ cắt phần tử đầu tiên từ mảng của sinh viên

db.vehicleinformation.find({make : "Toyota"}).pretty()
4

Kết quả

Làm cách nào để nắm bắt một trường cụ thể trong mongodb?

Bây giờ, chúng ta sẽ cắt phần tử cuối cùng trong mảng. Sử dụng toán tử $slice với “-1” để chỉ ra bản ghi cuối cùng

db.vehicleinformation.find({make : "Toyota"}).pretty()
5

Kết quả

Làm cách nào để nắm bắt một trường cụ thể trong mongodb?

Để bỏ qua các phần tử, chúng ta phải xác định các phần tử được bỏ qua và số phần tử được trả về. Các ví dụ sau minh họa kịch bản này

Bỏ qua phần tử đầu tiên và trả về hai phần tử tiếp theo

db.vehicleinformation.find({make : "Toyota"}).pretty()
6

Kết quả

Làm cách nào để nắm bắt một trường cụ thể trong mongodb?

Trong câu lệnh này, chúng ta cắt mảng “sinh viên” bằng cách bỏ qua phần tử đầu tiên và trả về hai phần tử còn lại. Chúng được xác định bên trong dấu ngoặc vuông []. Giá trị đầu tiên là phần tử bị bỏ qua, trong khi giá trị thứ hai là số lượng phần tử còn lại được trả về. Nếu mảng có ít hơn 2 phần tử sau khi bỏ qua phần tử đầu tiên sẽ trả về tất cả các phần tử còn lại

Toán tử $meta

Toán tử $meta được sử dụng để lấy siêu dữ liệu được liên kết với tài liệu. Toán tử $meta có thể được sử dụng với cả phép chiếu MongoDB Aggregation và MongoDB. Phần này sẽ chỉ trình bày những kiến ​​thức cơ bản về phép chiếu MongoDB và cách toán tử $meta sẽ được sử dụng trong phép chiếu

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

db.vehicleinformation.find({make : "Toyota"}).pretty()
7

Đối với “metaDataKeyword”, bạn có thể liên kết các giá trị này

  • Từ khóa "textScore". “textScore” sẽ trả về điểm số được liên kết với chuỗi $text đã cho. Về cơ bản, từ khóa này tìm cách khớp chính xác cụm từ tìm kiếm với trường đã cho trong tài liệu. Truy vấn $text là bắt buộc khi sử dụng từ khóa “textScore” từ MongoDB 4. 4
  • 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(). Hàm này trả về khóa chỉ mục cho tài liệu sử dụng chỉ mục không phải văn bản. Từ khóa này chỉ dành cho mục đích gỡ lỗi, không được sử dụng trong môi trường sản xuất

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ó thể là một phần của truy vấn phép chiếu trong tài liệu để lấy điểm văn bản. Biểu thức có thể là bao gồm hoặc loại trừ trong câu lệnh chiếu. Hạn chế duy nhất là nếu biểu thức được đặt thành một trường hiện có trong tài liệu, giá trị siêu dữ liệu được chiếu sẽ ghi đè lên giá trị hiện tại trong trường
  • Bạn không thể xác định “điểm văn bản” trong phương thức find(). Do đó, lựa chọn tốt nhất là sử dụng tập hợp MongoDB
  • Biểu thức $meta có thể được sử dụng trong hàm sort(). Siêu dữ liệu “textScore” sẽ được sắp xếp theo thứ tự giảm dần
  • Khi {$meta. Biểu thức “$textScore”} được bao gồm trong cả hàm chiếu và hàm sắp xếp, mỗi hàm có thể có các tên trường khác nhau cho biểu thức. Hệ thống truy vấn sẽ bỏ qua tên trường trong sort()

Bây giờ, hãy xem một vài ví dụ

Đối với {$meta. “textScore”}, chúng tôi sẽ sử dụng bộ sưu tập thực phẩm

db.vehicleinformation.find({make : "Toyota"}).pretty()
8

Kết quả

Làm cách nào để nắm bắt một trường cụ thể trong mongodb?

Hãy tạo một chỉ mục cho bộ sưu tập “thực phẩm”. Chúng tôi sẽ sử dụng trường “food_desc” để tạo chỉ mục văn bản

db.vehicleinformation.find({make : "Toyota"}).pretty()
9

Kết quả

Làm cách nào để nắm bắt một trường cụ thể trong mongodb?

Bây giờ chúng ta hãy tìm điểm văn bản. Chúng tôi sử dụng từ “pizza” làm cụm từ tìm kiếm và sử dụng toán tử $meta để lấy điểm văn bản cho từng tài liệu. (_id. 0) được sử dụng để bỏ qua id đối tượng của từng tài liệu để có đầu ra đơn giản hơn

db.vehicleinformation.find({make : "Toyota"}, {year : 1}).pretty()
0

Kết quả

Làm cách nào để nắm bắt một trường cụ thể trong mongodb?

Bây giờ vào {$meta. “khóa chỉ mục”}. Vì “indexKey” hoàn toàn chỉ dành cho mục đích gỡ lỗi, nên tài liệu chính thức của MongoDB nêu rõ như sau

db.vehicleinformation.find({make : "Toyota"}, {year : 1}).pretty()
1

Các ví dụ sau đây được tạo bằng cách sử dụng bộ sưu tập "vehiclesales". Sử dụng {_id. 0}, id đối tượng bị bỏ qua khỏi đầu ra

db.vehicleinformation.find({make : "Toyota"}, {year : 1}).pretty()
2

Kết quả

Làm cách nào để nắm bắt một trường cụ thể trong mongodb?

Ở đây, chúng tôi tạo một chỉ mục phức hợp bằng cách sử dụng các trường “make” và “type”

db.vehicleinformation.find({make : "Toyota"}, {year : 1}).pretty()
3

Kết quả

Làm cách nào để nắm bắt một trường cụ thể trong mongodb?

Tiếp theo, hãy thực hiện Phép chiếu với chỉ mục. Chúng tôi tìm kiếm các tài liệu trong bộ sưu tập "bán xe" có loại tương đương với "Thể thao" và sử dụng toán tử $meta để lấy khóa chỉ mục cho từng tài liệu

db.vehicleinformation.find({make : "Toyota"}, {year : 1}).pretty()
4

Kết quả

Làm cách nào để nắm bắt một trường cụ thể trong mongodb?

Còn các phép chiếu không có chỉ mục thì sao? . Trong trường hợp này, chỉ mục sẽ không được trả về vì trường giá không phải là một phần của chỉ mục