MongoDB Java kéo từ mảng

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

  1. Cập nhật mảng để thêm các phần tử vào các vị trí đã chỉ định
  2. Sắp xếp mảng nếu công cụ sửa đổi $sort được chỉ định
  3. Cắt mảng nếu công cụ sửa đổi $slice được chỉ định
  4. 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ả

MongoDB Java kéo từ mảng

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ả

MongoDB Java kéo từ mảng

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ả

MongoDB Java kéo từ 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 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ả

MongoDB Java kéo từ mảng

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ả

MongoDB Java kéo từ mảng

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ả

MongoDB Java kéo từ mảng

Ở đâ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”

MongoDB Java kéo từ mảng

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ả

MongoDB Java kéo từ mảng

Đầ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ả

MongoDB Java kéo từ mảng

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ả

MongoDB Java kéo từ mảng

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

MongoDB Java kéo từ mảng

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ả

MongoDB Java kéo từ mảng

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ả

MongoDB Java kéo từ mảng

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

MongoDB Java kéo từ mảng

Tài liệu sửa đổi

{ $pull: { : , .. } }
3

Kết quả

MongoDB Java kéo từ mảng

Đ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

MongoDB Java kéo từ mảng

Bộ sưu tập đã sửa đổi

{ $pull: { : , .. } }
4

Kết quả

MongoDB Java kéo từ mảng

Đầ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”

Làm cách nào để lấy dữ liệu từ mảng trong MongoDB?

Để tìm kiếm mảng đối tượng trong MongoDB, bạn có thể sử dụng toán tử $elemMatch . Toán tử này cho phép chúng ta tìm kiếm nhiều hơn một thành phần từ một đối tượng mảng.

Làm cách nào để chèn mảng trong MongoDB bằng Java?

Trình điều khiển Java MongoDB hỗ trợ cả tài liệu DBObject và BSON. .
insert() – Chèn một tài liệu hoặc nhiều tài liệu vào một bộ sưu tập
insertOne() – Chèn một tài liệu vào một bộ sưu tập
insertMany() – Chèn nhiều tài liệu vào một bộ sưu tập

Làm cách nào để sử dụng $push trong MongoDB?

Nếu trường không có trong tài liệu cần cập nhật, $push sẽ thêm trường mảng có giá trị làm thành phần của nó . Nếu trường không phải là một mảng, hoạt động sẽ thất bại. Nếu giá trị là một mảng, $push sẽ thêm toàn bộ mảng dưới dạng một phần tử. Để thêm riêng từng phần tử của giá trị, hãy sử dụng công cụ sửa đổi $each với $push.

Làm cách nào để cập nhật mảng trong MongoDB Java?

Bạn có thể sử dụng các phương thức updateOne() hoặc updateMany() để thêm, cập nhật hoặc xóa các phần tử mảng dựa trên các tiêu chí đã chỉ định . Nên sử dụng phương thức updateMany() để cập nhật nhiều mảng trong một bộ sưu tập.