Các toán tử $ Push và $ Pull là một phần của các toán tử mảng được thiết kế để sửa đổi các mảng trong các tài liệu MongoDB. Trong hướng dẫn này, tôi sẽ chỉ cho bạn cách các nhà khai thác đẩy và kéo hoạt động và cách sử dụng chúng với các sửa đổi và điều kiện 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.]
Các toán tử đẩy và kéo là gì?
Đẩy và kéo là hai hoạt động được sử dụng để thêm và loại bỏ các phần tử khỏi các mảng trong tài liệu MongoDB. Các phần tử đẩy và kéo được thực hiện bằng cách sử dụng các toán tử Push Push và $ kéo của MongoDB, tương ứng:
- Toán tử $ Push nối một giá trị được chỉ định vào một mảng. appends a specified value to an array.
- Toán tử Pull $ sẽ loại bỏ các giá trị khỏi một mảng phù hợp với một điều kiện được chỉ định. removes values from an array that matches a specified condition.
Cú pháp cơ bản của toán tử $ đẩy
{ $push: { : , ... } }
Cú pháp cơ bản của toán tử $ kéo
{ $pull: { : , ... } }
Hãy cùng nhìn vào từng chi tiết hơn, bao gồm cả cách chúng hoạt động và cách bạn có thể sử dụng chúng.
How HowDB $ Push Toán tử hoạt động
Bạn có thể thấy toán tử $ đẩy có hai đối số:
- Trường mảng
- Giá trị được gắn vào trường mảng được chỉ định
Nếu trường mảng không có trong tài liệu, toán tử đẩy $ sẽ tạo ra 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.
$ đẩy các công cụ sửa đổi vận hành
Chức năng của toán tử $ đẩy có thể được mở rộng thêm bằng cách sử dụng các bộ sửa đổi sau.
- $ mỗi. $ Mỗi công cụ sửa đổi được sử dụng để nối nhiều giá trị vào một mảng. Nếu $ mỗi toán tử không được chỉ định, tất cả các giá trị trong toán tử Push $ sẽ được thêm vào dưới dạng một mục duy nhất vào trường mảng trong tài liệu. The $each modifier is used to append multiple values to an array. If the $each operator is not specified, all values in the $push operator will be appended as a single item to the array field in the document.
- $ lát. Điều này giới hạn số lượng các phần tử trong mảng. Tuy nhiên, điều này phải được sử dụng cùng với $ mỗi công cụ sửa đổi. This limits the number of elements in the array. However, this must be used in conjunction with the $each modifier.
- $ Sắp xếp. Các công cụ sửa đổi $ sắp xếp đặt hàng các mục trong mảng. Công cụ sửa đổi này cũng yêu cầu sử dụng $ mỗi công cụ sửa đổi. The $sort modifiers orders the items in the array. This modifier also requires the use of $each modifier.
- $ vị trí. Toán tử $ Push nối một mục mới đến cuối một mảng theo mặc định. 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 phải được nối thêm. The $push operator appends a new item to the end of an array by default. Use the $position modifier if you want to explicitly specify the location where the item should be appended.
Hoạt động $ Push được thực hiện theo thứ tự sau, bất kể thứ tự xác định các công cụ sửa đổi:
- Cập nhật mảng để thêm các phần tử trong các vị trí được chỉ định.
- Sắp xếp mảng nếu công cụ sửa đổi $ sort được chỉ định.
- Cắt phần mảng nếu công cụ sửa đổi lát cắt $.
- 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 đẩy MongoDB $ để thao túng các tài liệu. Tôi sẽ hiển thị một vài ví dụ, vì vậy hãy nhảy vào cái bạn cần:
- Nối một giá trị duy nhất vào một mảng
- Nối nhiều giá trị vào một mảng
- Sử dụng các sửa đổi $ Sắp xếp và $ Slice
- Sử dụng công cụ sửa đổi vị trí $
Đối với bộ dữ liệu cơ sở cho các ví dụ này, tôi sẽ sử dụng bộ sưu tập caramedetails.
db.vehicledetails.find[].pretty[]
Result:
Nối một giá trị duy nhất vào một mảng
Nối nhiều giá trị vào một mảng
Sử dụng các sửa đổi $ Sắp xếp và $ Slice
Sử dụng công cụ sửa đổi vị trí $
db.vehicledetails.update[{"_id": ObjectId["5fbc52f05f9a62418038240d"]}, {$push: {"vehicle_colours": "red"}}]
Result:
Đối với bộ dữ liệu cơ sở cho các ví dụ này, tôi sẽ sử dụng bộ sưu tập caramedetails.
Hãy cho chúng tôi xem làm thế nào chúng ta có thể nối một giá trị duy nhất vào một mảng khi có trường mảng và nó không có mặt. Trong tất cả các ví dụ, trường _id _id được sử dụng để chỉ ra tài liệu nào nên được thêm vào mảng.
db.vehicledetails.update[{"_id": ObjectId["5fbc52f05f9a62418038240d"]}, {$push: {"vehicle_colours": "green"}}]
Result:
Ví dụ: Không có trường mảng
db.vehicledetails.update[{"_id": ObjectId["5fbc52f05f9a62418038240d"]}, {$push: {"make": "green"}}]
Result:
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.
Ví dụ: Khi trường mảng có mặt
Mục mới sẽ được nối vào cuối mảng.
Nếu chúng tôi cố gắng sử dụng toán tử $ Push cho trường không phải, nó sẽ dẫn đến lỗi. Mã sau đây trả về một lỗi khi chúng tôi đang cố gắng nối một giá trị vào trường không phải là một trò chơi.
db.vehicledetails.update[{"_id": ObjectId["5fbc52f55f9a62418038240e"]}, {$push: {"vehicle_colours": ["blue", "red", "yellow"]}}]
Result:
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ó $ mỗi công cụ sửa đổi.
Ví dụ: Nhiều giá trị không có $ mỗi công cụ sửa đổi
db.vehicledetails.update[{"_id": ObjectId["5fbc52f55f9a62418038240e"]}, {$push: {"vehicle_colours": { $each :["blue", "red", "yellow"]}}}]
Result:
Nếu không có công cụ sửa đổi $, MongoDB sẽ nối tất cả các giá trị là một giá trị duy nhất cho trường mảng được chỉ định.
Ở đây, bạn có thể thấy màu xanh da trời, màu đỏ, và màu vàng là các yếu tố của một mảng mới được tạo ra. Nhưng mảng đó chỉ là một yếu tố của mảng moteical_colours.
Ví dụ: Nhiều giá trị với $ mỗi công cụ sửa đổi
Khi một hoạt động đẩy $ được xác định với $ mỗi công cụ sửa đổi, mỗi phần tử trong hoạt động $ đẩy sẽ được thêm vào mảng dưới dạng các mục riêng lẻ.
db.vehicledetails.update[{"_id": ObjectId["5fbc52fb5f9a62418038240f"]}, {$push: {"vehicle_colours": { $each :["silver", "orange"], $sort: 1}}}]
Result:
Tại đây, xe cộ_colours có ba yếu tố sau khi hoạt động $ đẩy.
db.vehicledetails.update[{"_id": ObjectId["5fbc52fb5f9a62418038240f"]}, {$push: {"vehicle_colours": { $each :["dark blue"], $sort: 1, $slice: 5}}}]
Result:
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 nên thêm mục mới. Điều này sẽ ghi đè hành vi mặc định của việc nối các mục vào cuối mảng.
Trong ví dụ sau, chúng tôi sẽ thêm màu trắng trắng vào phần đầu của trường mảng trên xe cộ. Trong công cụ sửa đổi vị trí của vị trí $, số không [0] được sử dụng để chỉ ra vị trí đầu tiên [chỉ mục 0] của mảng.
{ $pull: { : , ... } }0
Result:
How HowDB $ Pull Toán tử hoạt động
Toán tử kéo $ được sử dụng để xóa tất cả các phiên bản của giá trị hoặc giá trị khỏi tài liệu MongoDB phù hợp với một điều kiện được chỉ định. Nếu một mảng chứa các tài liệu nhúng hoặc lồng nhau, điều kiện toán tử kéo $ được 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 được loại bỏ là một mảng, toán tử kéo $ chỉ xóa các phần tử trong mảng phù hợp với giá trị chính xác được chỉ định, bao gồm thứ tự xác định các phần tử. Nếu giá trị được chỉ định để xóa là một tài liệu, toán tử Pull $ sẽ xóa các phần tử phù hợp với các trường và giá trị được chỉ định. Trong trường hợp này, thứ tự của các trường bị loại bỏ.
Bây giờ tôi sẽ hướng dẫn bạn qua một vài ví dụ về toán tử $ kéo. Nhảy đến những người bạn cần:
- Xóa một mục từ một mảng
- Xóa tất cả các mục bằng một giá trị cụ thể
- Xóa các mục phù hợp với Pull $ được chỉ định
- Xóa các mục khỏi một mảng tài liệu
Trong các ví dụ này, chúng tôi sẽ sử dụng tập dữ liệu sau để chứng minh:
Xóa một mục từ một mảng
Xóa tất cả các mục bằng một giá trị cụ thể
{ $pull: { : , ... } }1
Result:
Xóa các mục phù hợp với Pull $ được chỉ định
Xóa các mục khỏi một mảng tài liệu
{ $pull: { : , ... } }2
Result:
Trong các ví dụ này, chúng tôi sẽ sử dụng tập dữ liệu sau để chứng minh:
Ở đây, chúng tôi sẽ loại bỏ một giá trị đơn lẻ 2018 2018 khỏi trường Model Model_Year. Trường _id _id được sử dụng để chỉ ra tài liệu mà hoạt động kéo $ sẽ xảy ra.
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 tôi sẽ sử dụng bộ sưu tập của các trò chơi điện tử, để loại bỏ các màu sắc màu xanh lam và màu xanh lá cây từ trường Mảng carments_colours và loại bỏ mô hình năm 2020 khỏi trường Model Model_Year.
{ $pull: { : , ... } }3
Result:
Xóa các mục khớp với điều kiện kéo $ được chỉ định
Sử dụng bộ sưu tập Student Student_grades, chúng ta hãy tạo một điều kiện để loại bỏ tất cả các lớp nhỏ hơn hoặc bằng 50 từ tài liệu sau.
Tài liệu chưa được sửa đổi:
Tài liệu đã sửa đổi:
Điều kiện được chỉ định [{$ lte: 50}] đã loại bỏ bất kỳ mục nào nhỏ hơn hoặc bằng 50 trong trường mảng của lớp.
{ $pull: { : , ... } }4
Result:
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 của Student Student_Grades, để xóa tất cả các giá trị nhỏ hơn hoặc bằng 50 trong trường mảng của lớp trên các tài liệu trong bộ sưu tập.
Bộ sưu tập không sửa đổi:
- Bộ sưu tập sửa đổi:
- Đầu ra trên chứng minh cho chúng tôi 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 của lớp trên mạng trong tất cả các tài liệu trong bộ sưu tập của Student Student_Grades.
- Điều đó kết thúc hướng dẫn này.
- Đọc liên quan
BMC Machine Learning & Big Data Blog
Hướng dẫn MongoDB, một loạt các bài báo và hướng dẫn