Toán tử $push và $pull là một phần của toán tử mảng được thiết kế để sửa đổi mảng trong tài liệu MongoDB. Trong hướng dẫn này, tôi sẽ chỉ cho bạn cách hoạt động của các toán tử đẩy và kéo cũng như cách sử dụng chúng với các điều kiện và bổ trợ bổ sung
[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. ]
Toán tử đẩy và kéo là gì?
Đẩy và kéo là hai thao tác được sử dụng để thêm và xóa các phần tử khỏi mảng trong tài liệu MongoDB. Việc đẩy và kéo các phần tử được thực hiện bằng cách sử dụng các toán tử $push và $pull của MongoDB, tương ứng
- Toán tử $push nối một giá trị đã chỉ định vào một mảng
- Toán tử $pull xóa các giá trị khỏi một mảng khớp với một điều kiện đã chỉ định
Cú pháp cơ bản của toán tử $push
{ $push: { : , .. } }
Cú pháp cơ bản của toán tử $pull
{ $pull: { : , .. } }
Hãy xem xét từng chi tiết hơn, bao gồm cách chúng hoạt động và cách bạn có thể sử dụng chúng
Cách hoạt động của toán tử MongoDB $push
Bạn có thể thấy toán tử $push nhận hai đối số
- trường mảng
- Giá trị được thêm vào trường mảng đã chỉ định
Nếu trường mảng không có trong tài liệu, toán tử $push sẽ tạo một trường mảng mới. Tuy nhiên, nếu trường được chỉ định không phải là một mảng, MongoDB sẽ trả về lỗi
công cụ sửa đổi toán tử $push
Chức năng của toán tử $push có thể được mở rộng hơn nữa bằng cách sử dụng các công cụ sửa đổi sau
- mỗi $. Công cụ sửa đổi $each được sử dụng để nối nhiều giá trị vào một mảng. Nếu toán tử $each không được chỉ định, tất cả các giá trị trong toán tử $push sẽ được thêm dưới dạng một mục vào trường mảng trong tài liệu
- $lát. Điều này giới hạn số phần tử trong mảng. Tuy nhiên, điều này phải được sử dụng cùng với công cụ sửa đổi $each
- $sắp xếp. Công cụ sửa đổi $sort sắp xếp thứ tự các mục trong mảng. Công cụ sửa đổi này cũng yêu cầu sử dụng công cụ sửa đổi $each
- vị trí $. Theo mặc định, toán tử $push nối một mục mới vào cuối một mảng. Sử dụng công cụ sửa đổi vị trí $ nếu bạn muốn chỉ định rõ ràng vị trí nơi mục sẽ được thêm vào
Hoạt động $push được thực hiện theo thứ tự sau, bất kể thứ tự mà các công cụ sửa đổi được xác định
- Cập nhật mảng để thêm các phần tử vào các vị trí đã chỉ định
- Sắp xếp mảng nếu công cụ sửa đổi $sort được chỉ định
- Cắt mảng nếu công cụ sửa đổi $slice được chỉ định
- Lưu trữ mảng
Tiếp theo, chúng ta sẽ xem xét cách chúng ta có thể sử dụng các hoạt động $push của MongoDB để thao tác với tài liệu. Tôi sẽ đưa ra một vài ví dụ, vì vậy hãy chuyển đến ví dụ bạn cần
Đối với tập dữ liệu cơ sở cho những ví dụ này, tôi sẽ sử dụng bộ sưu tập “vehicledetails”
db.vehicledetails.find[].pretty[]
Kết quả
Nối một giá trị duy nhất vào một mảng
Hãy cho chúng tôi xem cách chúng tôi có thể nối thêm một giá trị vào một mảng khi có trường mảng và trường đó không có. Trong tất cả các ví dụ, trường “_id” được sử dụng để cho biết mảng nào sẽ được thêm vào tài liệu nào
Thí dụ. Không có trường mảng
Một trường mảng mới sẽ được tạo với tên trường được chỉ định trong toán tử $push
db.vehicledetails.update[{"_id": ObjectId["5fbc52f05f9a62418038240d"]}, {$push: {"vehicle_colours": "red"}}]
Kết quả
Thí dụ. Khi trường mảng có mặt
Mục mới sẽ được thêm vào cuối mảng
db.vehicledetails.update[{"_id": ObjectId["5fbc52f05f9a62418038240d"]}, {$push: {"vehicle_colours": "green"}}]
Kết quả
Nếu chúng tôi cố gắng sử dụng toán tử $push cho trường không phải mảng, nó sẽ dẫn đến lỗi. Đoạn mã sau trả về lỗi khi chúng tôi đang cố nối thêm một giá trị vào trường không phải mảng “make”
db.vehicledetails.update[{"_id": ObjectId["5fbc52f05f9a62418038240d"]}, {$push: {"make": "green"}}]
Kết quả
Nối nhiều giá trị vào một mảng
Bạn có thể nối nhiều giá trị vào một mảng có hoặc không có công cụ sửa đổi $each
Thí dụ. Nhiều giá trị không có công cụ sửa đổi $each
Nếu không có công cụ sửa đổi $each, MongoDB sẽ nối tất cả các giá trị dưới dạng một giá trị vào trường mảng đã chỉ định
db.vehicledetails.update[{"_id": ObjectId["5fbc52f55f9a62418038240e"]}, {$push: {"vehicle_colours": ["blue", "red", "yellow"]}}]
Kết quả
Tại đây, bạn có thể thấy “xanh dương”, “đỏ” và “vàng” là các phần tử của một mảng mới được tạo. Nhưng mảng đó chỉ là một phần tử của mảng “vehical_colors”
Thí dụ. Nhiều giá trị với công cụ sửa đổi $each
Khi một thao tác $push được xác định bằng công cụ sửa đổi $each, mỗi phần tử trong thao tác $push sẽ được thêm vào mảng dưới dạng các mục riêng lẻ
db.vehicledetails.update[{"_id": ObjectId["5fbc52f55f9a62418038240e"]}, {$push: {"vehicle_colours": { $each :["blue", "red", "yellow"]}}}]
Kết quả
Ở đây, “vehicle_colors” có ba thành phần sau thao tác $push
Sử dụng Công cụ sửa đổi $sort và $slice
Trong phần này, chúng tôi sẽ trình bày cách sử dụng các công cụ sửa đổi $sort và $slice bằng cách sử dụng tài liệu sau đây trong bộ sưu tập “vehicledetails”
Hãy để chúng tôi thêm màu “bạc” vào trường mảng “vehicle_colours” và sắp xếp nội dung theo thứ tự bảng chữ cái [thứ tự tăng dần]
________số 8_______Kết quả
Đầu ra ở trên cho chúng ta thấy rằng các màu mới đã được thêm vào và mảng đã được sắp xếp theo thứ tự bảng chữ cái. Trong ví dụ sau, chúng ta sẽ thêm màu “xanh đậm” vào trường mảng trong khi sắp xếp theo thứ tự bảng chữ cái và sử dụng công cụ sửa đổi $slice để giới hạn mảng ở 5 phần tử
db.vehicledetails.update[{"_id": ObjectId["5fbc52fb5f9a62418038240f"]}, {$push: {"vehicle_colours": { $each :["dark blue"], $sort: 1, $slice: 5}}}]
Kết quả
Sử dụng công cụ sửa đổi vị trí $
Công cụ sửa đổi vị trí $ được sử dụng để chỉ định vị trí trong mảng nơi mục mới sẽ được thêm vào. Điều này sẽ ghi đè hành vi mặc định của việc thêm các mục vào cuối mảng
Trong ví dụ sau, chúng ta sẽ thêm màu “white” vào đầu trường mảng “vehicle_colours”. Trong công cụ sửa đổi “$position”, số không [0] được sử dụng để chỉ vị trí đầu tiên [chỉ số 0] của mảng
{ $pull: { : , .. } }0
Kết quả
Cách hoạt động của toán tử MongoDB $pull
Toán tử $pull được sử dụng để xóa tất cả các phiên bản của một hoặc nhiều giá trị khỏi tài liệu MongoDB khớp với một điều kiện đã chỉ định. Nếu một mảng chứa các tài liệu được nhúng hoặc lồng nhau, thì điều kiện toán tử $pull đã chỉ định sẽ được áp dụng cho từng phần tử mảng như thể mỗi phần tử mảng là một tài liệu trong một bộ sưu tập
Khi giá trị được chỉ định bị xóa là một mảng, toán tử $pull chỉ xóa các phần tử trong mảng khớp với giá trị chính xác được chỉ định, bao gồm cả thứ tự xác định các phần tử. Nếu giá trị được chỉ định cần xóa là một tài liệu, toán tử $pull sẽ xóa các phần tử khớp với các trường và giá trị được chỉ định. Trong trường hợp này, thứ tự các trường bị loại bỏ
Bây giờ tôi sẽ hướng dẫn bạn một vài ví dụ về toán tử $pull. Chuyển đến những cái bạn cần
Trong các ví dụ này, chúng tôi sẽ sử dụng tập dữ liệu sau để chứng minh
Loại bỏ một mục duy nhất khỏi một mảng
Ở đây, chúng tôi sẽ xóa giá trị duy nhất “2018” khỏi trường mảng “model_year”. Trường “_id” được sử dụng để chỉ ra tài liệu mà thao tác $pull sẽ diễn ra trên đó
{ $pull: { : , .. } }1
Kết quả
Xóa tất cả các mục bằng một giá trị được chỉ định
Trong ví dụ này, chúng ta sẽ sử dụng bộ sưu tập “vehicledetails” để xóa màu “blue” và “green” khỏi trường mảng “vehicle_colours” và xóa năm mô hình 2020 khỏi trường mảng “model_year”
{ $pull: { : , .. } }2
Kết quả
Xóa các mục phù hợp với Điều kiện $pull đã chỉ định
Sử dụng tập hợp “student_grades”, chúng ta hãy tạo một điều kiện để xóa tất cả các điểm nhỏ hơn hoặc bằng 50 khỏi tài liệu sau
Tài liệu chưa sửa đổi
Tài liệu sửa đổi
{ $pull: { : , .. } }3
Kết quả
Điều kiện xác định [{$lte. 50}] đã xóa bất kỳ mục nào nhỏ hơn hoặc bằng 50 trong trường mảng "điểm"
Xóa các mục khỏi một mảng tài liệu
Trong ví dụ này, chúng tôi sẽ sử dụng bộ sưu tập “student_grades” để xóa tất cả các giá trị nhỏ hơn hoặc bằng 50 trong trường mảng “grades” trong tất cả các tài liệu trong bộ sưu tập
Bộ sưu tập chưa sửa đổi
Bộ sưu tập đã sửa đổi
{ $pull: { : , .. } }4
Kết quả
Đầu ra ở trên cho chúng ta thấy rằng bất kỳ giá trị nào nhỏ hơn hoặc bằng 50 đã bị xóa khỏi trường mảng “grades” trong tất cả các tài liệu trong bộ sưu tập “student_grades”