Contents

11 truy vấn và thao tác MongoDB bạn phải biết

MongoDB đã trở nên phổ biến đáng kể đối với các nhà phát triển nhờ các khả năng đặc biệt của nó như tính linh hoạt, khả năng mở rộng và quản lý hiệu quả lượng dữ liệu khổng lồ. Là một lựa chọn lý tưởng cho các ứng dụng phần mềm hiện đại, MongoDB mang đến cho người dùng cơ hội nâng cao trình độ của họ liên quan đến các truy vấn được tiêu chuẩn hóa và quy trình vận hành.

Bằng cách hiểu rõ các yêu cầu và quy trình MongoDB phổ biến, người ta có thể trích xuất và chỉnh sửa thông tin một cách hiệu quả trong khi xây dựng cấu trúc dữ liệu vững chắc và các chương trình đáp ứng người dùng, từ đó nâng cao trình độ thành thạo của họ.

Tạo hoặc chuyển đổi cơ sở dữ liệu

Tạo cơ sở dữ liệu cục bộ bằng trình bao MongoDB là một quá trình không phức tạp, đặc biệt khi một người đã thiết lập một cụm từ xa. Để tạo cơ sở dữ liệu mới trong MongoDB, hãy sử dụng lệnh sau:

 use db_name 

Trong khi thực hiện lệnh đã đề cập trước đó sẽ thiết lập thành công cơ sở dữ liệu mới, bạn cũng có thể sử dụng nó để chuyển đổi sang cơ sở dữ liệu đã tồn tại mà không cần thực hiện quy trình tạo mới.

Thả cơ sở dữ liệu

Để bắt đầu, hãy sử dụng lệnh use, giống như chúng ta đã làm trước đây, để kết nối với cơ sở dữ liệu mong muốn cần được loại bỏ. Tiếp theo, sử dụng chức năng dropDatabase() để xóa hoàn toàn cơ sở dữ liệu khỏi hệ thống của bạn.

 use db_name
db.dropDatabase()

Tạo Bộ sưu tập

Để thiết lập một bộ sưu tập trong cơ sở dữ liệu dự định, vui lòng sử dụng phương thức createCollection() trong môi trường MongoDB của bạn:

 db.createCollection("collection_name")

Thay thế collection_name bằng tên bộ sưu tập bạn đã chọn.

Chèn Tài liệu vào Bộ sưu tập

Khi truyền thông tin đến một kho lưu trữ, có thể truyền một bản ghi riêng lẻ hoặc toàn bộ tập hợp các bản ghi.

Để chèn một tài liệu:

 db.collection_name.insertOne({"Name":"Idowu", "Likes":"Chess"})

Người ta có thể sử dụng phương pháp đã nói ở trên để kết hợp một mảng tài liệu chứa một mã định danh duy nhất:

 db.collection_name.insertOne([{"Name":"Idowu", "Likes":"Chess"}, {"Language": "Mongo", "is_admin": true}])

Để thêm đồng thời nhiều tài liệu có số nhận dạng duy nhất, hãy sử dụng phương thức “insertMany”:

 db.collection_name.insertMany([{"Name":"Idowu", "Likes":"Chess"}, {"Name": "Paul", "Likes": "Wordle"}])

Nhận tất cả tài liệu từ một bộ sưu tập

Để truy xuất tất cả các tài liệu trong một bộ sưu tập được chỉ định, phương thức find() có thể được sử dụng bằng cách sử dụng từ khóa cơ sở dữ liệu có liên quan.

 db.collection_name.find()

Phương pháp đã nói ở trên truy xuất mọi tài liệu có trong bộ sưu tập được chỉ định.

/vi/images/query-result-sample-mongodb-find.jpg

Bạn cũng có thể hạn chế thông tin truy xuất ở một số lượng cụ thể. Ví dụ, hãy xem xét hướng dẫn sau để chỉ lấy hai bản ghi ban đầu:

 db.collection_name.find().limit(2)

Lọc Tài liệu trong Bộ sưu tập

Hãy coi tập dữ liệu là một minh họa, trong đó tồn tại nhiều phương pháp lọc trong lĩnh vực MongoDB.

/vi/images/sample-data-for-filtering.jpg

Sử dụng phương pháp “tìm” khi truy xuất thông tin từ một trường duy nhất trong tài liệu.

 db.collection_name.find({"Likes":"Wordle"}, {"_id":0, "Name":1})

Truy vấn đã nói ở trên truy xuất tất cả các tài liệu có thuật ngữ"Thích"xuất hiện, trong khi bỏ qua mã định danh tài liệu cụ thể và chỉ tập trung vào tên tài liệu.

/vi/images/filter-example-one.jpg

Để truy xuất danh sách tên người dùng trên 21 tuổi, người ta có thể sử dụng toán tử lớn hơn được ký hiệu là “$gt”.

 db.collection_name.find({"Likes":"Chess", "Age":{"$gt":21}}, {"_id":0, "Name":1})

Đầu ra trông giống như vậy:

/vi/images/filter-example-two.jpg

Khi thay thế “find” bằng “findOne”, bạn nên thận trọng quan sát mọi thay đổi về chức năng. Cần lưu ý rằng có nhiều từ khóa lọc bổ sung tồn tại trong hệ thống.

Ký hiệu “$lt” đại diện cho một biểu thức logic đánh giá là đúng đối với tất cả các giá trị nhỏ hơn một giá trị đã chỉ định, trong khi nếu không thì nó là sai.

Ký hiệu “$gte” đại diện cho một toán tử logic được sử dụng trong các truy vấn và biểu thức, cho biết rằng một giá trị phải bằng hoặc lớn hơn một giá trị cụ thể. Nó có thể được biểu diễn là “lớn hơn hoặc bằng” trong tiếng Anh đơn giản.

Ký hiệu “$lte” đại diện cho một biểu thức logic đánh giá xem một giá trị đã cho có nhỏ hơn hoặc bằng một giá trị được chỉ định khác hay không, kết quả là đúng nếu điều kiện được đáp ứng và sai nếu không đáp ứng.

Hàm = truy xuất tất cả các phần tử trong một tập hợp nhất định bằng một giá trị cụ thể.

Tập hợp tất cả các phần tử không sở hữu giá trị được chỉ định được ký hiệu là “$ne”.

Toán tử “$in” có thể được sử dụng khi truy vấn dữ liệu dựa trên một mảng, truy xuất tất cả các phần tử tương ứng với bất kỳ mục nào trong mảng đã chỉ định. Ngược lại, toán tử “$not in ($)” (hoặc “$nin”) được sử dụng để trả về kết quả cho các phần tử không khớp với bất kỳ giá trị nào trong mảng được cung cấp.

Sắp xếp truy vấn

Sắp xếp là một quá trình sắp xếp dữ liệu theo một trình tự được xác định trước, theo thứ tự giảm dần hoặc tăng dần, dựa trên một tiêu chí cụ thể. Điều quan trọng cần lưu ý là việc phân loại đòi hỏi phải sử dụng thước đo có thể định lượng để thực hiện đúng.

Chẳng hạn, để sắp xếp theo thứ tự tăng dần:

 db.collection_name.find({"Likes":"Chess"}).sort({"Age":1})

Để sắp xếp câu hỏi nói trên theo thứ tự giảm dần, hãy thay “1” bằng “-1”.

 db.collection_name.find({"Likes":"Chess"}).sort({"Age":-1})

Cập nhật tài liệu

MongoDB sử dụng các toán tử nguyên tử kết hợp với các truy vấn cập nhật để xác định kết quả mong muốn của việc sửa đổi dữ liệu. Dưới đây, chúng tôi đã biên soạn một lựa chọn các toán tử nguyên tử được sử dụng thường xuyên cho mục đích này:

Thật vậy, có vẻ như có một số mâu thuẫn về thuật ngữ giữa hai phần văn bản mà bạn đã cung cấp. Trong phần đầu tiên, thuật ngữ “Tập hợp” được sử dụng để chỉ một nhóm các trường trên một biểu mẫu, trong khi ở phần thứ hai, thuật ngữ “Tập hợp trường” được sử dụng để biểu thị cụ thể một tập hợp các trường có mục đích chung. Có thể hữu ích nếu chuẩn hóa ngôn ngữ được sử dụng trong cả hai phần để có sự rõ ràng và nhất quán.

Lệnh $push được sử dụng để thêm một phần tử mới vào một mảng và có thể được ghép nối với toán tử $each để chèn đồng thời nhiều phần tử.

Hàm $pull là một lệnh loại bỏ một phần tử hoặc các phần tử khỏi một mảng dựa trên một giá trị khóa được chỉ định. Nó có thể được sử dụng cùng với toán tử $in để loại bỏ nhiều mục cùng một lúc một cách hiệu quả, bằng cách chỉ định một mảng giá trị cho tham số values ​​.

Lệnh $unset trong MongoDB được sử dụng để xóa một hoặc nhiều trường cụ thể khỏi tài liệu hiện có. Thao tác này có thể được thực hiện trên bất kỳ bộ sưu tập nào và nó sẽ cập nhật tất cả các tài liệu trong bộ sưu tập đó với trường đã chỉ định đã bị xóa. Cú pháp sử dụng phương thức unset liên quan đến việc chỉ định tên của trường bạn muốn bỏ đặt cũng như các tùy chọn để sửa đổi truy vấn nếu cần.

Để sửa đổi một tài liệu hiện có đồng thời kết hợp một yếu tố mới, hãy xem xét các bước sau:1. Truy cập tài liệu mà bạn muốn sửa đổi và thực hiện các thay đổi mong muốn đối với nội dung hoặc định dạng của nó. Điều này có thể liên quan đến việc sửa lỗi, cập nhật thông tin lỗi thời hoặc thêm chi tiết mới.2. Xác định những thay đổi cụ thể nào là cần thiết dựa trên mục đích và mục tiêu của bạn. Chẳng hạn, nếu bạn muốn đưa các trường dữ liệu bổ sung vào tài liệu, hãy quyết định loại thông tin nào mà những trường này sẽ chứa và cách chúng sẽ được tổ chức trong cấu trúc tổng thể của tài liệu.3. Thực hiện các thay đổi bằng cách thực hiện các sửa đổi thích hợp trực tiếp cho chính tài liệu đó. Tùy thuộc vào bản chất của các bản cập nhật, điều này có thể liên quan đến việc chỉnh sửa văn bản, điều chỉnh định dạng hoặc thêm các phần mới.4. Xem lại tài liệu sửa đổi một cách cẩn thận để đảm bảo

 db.collection_name.updateOne({"Name":"Sandy"}, {"$set":{"Name":"James", "email":"[email protected]"}})

Các sửa đổi nói trên sửa đổi văn bản được chỉ định theo cách được mô tả dưới đây:

/vi/images/sample-update-query.jpg

Quá trình loại bỏ trường email có thể được thực hiện dễ dàng bằng cách sử dụng toán tử $unset, hoạt động như một công cụ mạnh mẽ để loại bỏ hiệu quả các phần tử không mong muốn khỏi mảng và đối tượng trong PHP. Thao tác này chỉ bao gồm việc chỉ định phần tử mong muốn xóa, theo sau là từ khóa $unset, cho phép nhà phát triển quản lý hiệu quả cấu trúc dữ liệu trong khi vẫn duy trì độ rõ ràng và chính xác trong mã của họ.

 db.collection_name.updateOne({"Name":"Sandy"}, {"$unset":{"email":"[email protected]"}})

Xem xét dữ liệu mẫu sau:

/vi/images/sample-data-for-update-example.jpg

Người ta có thể tăng nội dung của các phần tử hiện tại trong mảng mục bằng cách sử dụng toán tử $push, cho phép đưa các mục nhập mới vào tập hợp các điểm dữ liệu này.

 db.collection_name.updateOne({"Name":"Pete"}, {"$push":{"items":"Plantain"}})

Đây là đầu ra:

/vi/images/update-query-result-sample.jpg

Sử dụng toán tử $each để chèn đồng thời nhiều phần tử:

 db.collection_name.updateOne({"Name":"Pete"}, {"$push":{"items": {"$each":["Almond", "Melon"]}}})

Đây là đầu ra:

/vi/images/updated-data-multiple-updates.jpg

Như đã nêu trước đây, việc sử dụng toán tử $pull dẫn đến việc loại bỏ một phần tử hoặc cặp khóa-giá trị được chỉ định trong một mảng.

 db.collection_name.updateOne({"Name":"Pete"}, {"$pull":{"items":"Plantain"}})

Dữ liệu cập nhật trông như vậy:

/vi/images/removed-data-sample.jpg

Để loại bỏ nhiều phần tử khỏi một mảng nhất định một cách hiệu quả, hãy sử dụng hàm “include\_array” và chuyển mảng mong muốn cùng với (các) khóa cụ thể hoặc phạm vi chỉ mục mà bạn muốn loại trừ. Bằng cách sử dụng hàm “include\_array” với toán tử “$in”, bạn có thể lọc đồng thời nhiều phần tử không mong muốn một cách hiệu quả mà không cần loại bỏ từng phần tử một.

 db.collection_name.updateOne({"Name":"Pete"}, {"$pull":{"items": {"$in":["Almond", "Melon"]} }}) 

Xóa Tài liệu hoặc Trường

Từ khóa “deleteOne” hoặc “deleteMany” được sử dụng để loại bỏ tài liệu khỏi bộ sưu tập cơ sở dữ liệu. Khi sử dụng các lệnh này, điều quan trọng là phải chỉ định trường cụ thể mà việc xóa sẽ dựa trên đó. Điều này cho phép loại bỏ có mục tiêu các bản ghi cụ thể trong khi bảo tồn các bản ghi khác có thể có các giá trị khác nhau cho trường được chỉ định.

 db.collection_name.deleteOne({"Name":"IDNoble"})

Để loại bỏ hiệu quả vô số tài liệu chia sẻ các khóa giống hệt nhau, bạn nên sử dụng phương thức “deleteMany” thay vì cố gắng thực hiện truy vấn được cung cấp. Truy vấn cụ thể này sẽ xóa tất cả các mục trong cơ sở dữ liệu có nội dung mô tả"Cờ vua"là một trong những tùy chọn được liệt kê của nó.

 db.collection.deleteMany({"Likes":"Chess"})

Thao tác lập chỉ mục

Lập chỉ mục là một kỹ thuật nâng cao hiệu quả của các truy vấn cơ sở dữ liệu bằng cách giảm khối lượng dữ liệu phải được kiểm tra. Việc tối ưu hóa này có thể đạt được thông qua việc tạo các chỉ mục trên các trường được sử dụng thường xuyên trong cơ sở dữ liệu, điều này cuối cùng dẫn đến hiệu suất truy vấn được cải thiện.

Theo cách tương tự, MongoDB sử dụng các kỹ thuật lập chỉ mục phản ánh những kỹ thuật được sử dụng trong việc tối ưu hóa các truy vấn SQL thông qua việc triển khai các chỉ mục trên các trường cụ thể. Để minh họa, hãy xem xét việc tạo chỉ mục tăng dần trên trường “Tên”.

 db.collection.createIndex({"Name":1})

Để liệt kê các chỉ mục của bạn:

 db.collection.getIndexes()

Ngoài phương pháp đã đề cập trước đó, còn tồn tại nhiều cách tiếp cận khác nhau để tạo chỉ mục trong ngữ cảnh của hệ thống cơ sở dữ liệu MongoDB.

Tập hợp

Aggregation Pipeline, một phép lặp tinh tế của MapReduce, tạo điều kiện thuận lợi cho việc chạy và duy trì các tính toán phức tạp trong lĩnh vực MongoDB. Trái ngược với MapReduce, vốn yêu cầu tạo các hàm JavaScript riêng biệt cho các quy trình ánh xạ và rút gọn, Aggregation mang lại trải nghiệm liền mạch bằng cách tận dụng các thủ tục MongoDB tích hợp sẵn.

Ví dụ: xem xét dữ liệu bán hàng sau:

/vi/images/sales-sample-data-from-mongodb-1.jpg

Khung tổng hợp của MongoDB cho phép tính toán và duy trì số liệu bán hàng tổng hợp cho mọi phân loại sản phẩm bằng cách thực hiện các bước sau:

 db.sales.aggregate([{$group:{"_id":"$Section", "totalSold":{$sum:"$Sold"}}}, {$project:{"_id":0, "totalSold":1, "Section":"$_id"}}])

Truy vấn trên trả về như sau:

/vi/images/aggregate-result-sample-1.jpg

Truy vấn MongoDB chính

MongoDB cung cấp các kỹ thuật khác nhau để truy vấn dữ liệu, có thể nâng cao hiệu quả truy vấn. Các cấu trúc truy vấn cơ bản được nêu ở trên phục vụ cho các ngôn ngữ lập trình khác nhau và đóng vai trò là điểm vào để truy cập cơ sở dữ liệu MongoDB.

Bất chấp các biến thể tiềm năng trong cú pháp cơ bản, một số ngôn ngữ lập trình thừa nhận các kiểu cách viết hoa riêng biệt. Như một minh họa, Python hỗ trợ định dạng trường hợp con rắn, trong khi JavaScript sử dụng quy ước trường hợp lạc đà. Điều quan trọng là phải điều tra và hiểu các yêu cầu của nền tảng công nghệ ưa thích của một người trước khi thực hiện các quy ước đặt tên.