Trong MongoDB, bạn có thể sử dụng $pull
toán tử để xóa các giá trị khỏi một mảng.
Sử dụng $pull
kết hợp với một phương thức như update()
để cập nhật tài liệu được chỉ định với sự thay đổi.
Ví dụ
Giả sử chúng ta có một bộ sưu tập được gọi là products
với các tài liệu sau:
{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M", "XL", "XXL" ] } { "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "prod" : "Cap", "sizes" : [ "XS", "S", "M", "L", "XL" ] }
Chúng ta có thể xóa một phần tử khỏi mảng trong tài liệu 1 như sau:
db.products.update(
{ _id: 1 },
{ $pull: { sizes: "XXL" } }
)
Đầu ra:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Thông báo đó cho chúng tôi biết rằng một tài liệu đã khớp và một tài liệu (tức là cùng một tài liệu) đã được sửa đổi.
Bây giờ chúng ta hãy xem bộ sưu tập:
db.products.find()
Kết quả:
{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M", "XL" ] } { "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "prod" : "Cap", "sizes" : [ "XS", "S", "M", "L", "XL" ] }
Chúng ta có thể thấy rằng mảng trong tài liệu 1 đã có giá trị XXL
đã xóa như đã chỉ định.
Xóa nhiều giá trị
Chúng tôi có thể sử dụng $in
toán tử để chỉ định nhiều giá trị mà chúng tôi muốn xóa khỏi mảng.
Ví dụ:
db.products.update(
{ _id: 3 },
{ $pull: { sizes: { $in: ["XS", "XL"] } } }
)
Đầu ra:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Bây giờ chúng ta hãy kiểm tra lại bộ sưu tập:
db.products.find()
Kết quả:
{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M", "XL" ] } { "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "prod" : "Cap", "sizes" : [ "S", "M", "L" ] }
Chúng ta có thể thấy rằng hai phần tử được chỉ định đã bị xóa khỏi mảng trong tài liệu 3.
Cập nhật tất cả tài liệu
Bạn có thể thêm multi: true
hoặc sử dụng updateMany()
phương pháp cập nhật tất cả các tài liệu phù hợp với tiêu chí.
Khi bạn thực hiện việc này, hãy xóa mọi tiêu chí lựa chọn khỏi tài liệu truy vấn đầu tiên (chỉ định / s tài liệu nào cần cập nhật). Nói cách khác, sử dụng tài liệu trống làm đối số đầu tiên cho update()
(hoặc updateMany()
) phương pháp.
Ví dụ:
db.products.update(
{ },
{ $pull: { sizes: "XL" } },
{ multi: true }
)
Đầu ra:
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 2 })
Trong trường hợp này, chúng ta có thể thấy rằng ba tài liệu khớp nhau (vì có ba tài liệu trong bộ sưu tập), nhưng chỉ có hai tài liệu được sửa đổi (vì chỉ có hai tài liệu có giá trị XL
ở các kích thước sizes
mảng).
Và kiểm tra lại bộ sưu tập:
db.products.find()
Kết quả:
{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M" ] } { "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L" ] } { "_id" : 3, "prod" : "Cap", "sizes" : [ "S", "M", "L" ] }
Chúng ta có thể thấy rằng tất cả các bản sao của XL
đã bị xóa khỏi tất cả các tài liệu trong bộ sưu tập.
Mảng tài liệu
Nếu bạn có mảng chứa tài liệu dưới dạng phần tử của chúng, bạn có thể xóa bất kỳ tài liệu nào trong số đó bằng cách chỉ định tiêu chí phù hợp với dữ liệu trong tài liệu.
Giả sử chúng ta có một bộ sưu tập được gọi là nhà hàng mà các tài liệu sau:
{ "_id" : 1, "name" : "The Rat", "reviews" : [ { "name" : "Stanley", "date" : "04 December, 2020", "ordered" : "Dinner", "rating" : 1 }, { "name" : "Tom", "date" : "04 October, 2020", "ordered" : "Lunch", "rating" : 2 } ] } { "_id" : 2, "name" : "Yum Palace", "reviews" : [ { "name" : "Stacey", "date" : "08 December, 2020", "ordered" : "Lunch", "rating" : 3 }, { "name" : "Tom", "date" : "08 October, 2020", "ordered" : "Breakfast", "rating" : 4 } ] } { "_id" : 3, "name" : "Boardwalk Cafe", "reviews" : [ { "name" : "Steve", "date" : "20 December, 2020", "ordered" : "Breakfast", "rating" : 5 }, { "name" : "Lisa", "date" : "25 October, 2020", "ordered" : "Dinner", "rating" : 5 }, { "name" : "Kim", "date" : "21 October, 2020", "ordered" : "Dinner", "rating" : 5 } ] }
Trong trường hợp này, trường được gọi là reviews
chứa một mảng tài liệu. Mỗi tài liệu là một đánh giá khác nhau về nhà hàng được đề cập.
Chúng tôi có thể sử dụng $pull
để xóa các bài đánh giá phù hợp với một tiêu chí nhất định.
Ví dụ:
db.restaurants.update(
{ },
{ $pull: { reviews: { rating: { $lt: 4 } } } },
{ multi: true }
)
Đầu ra:
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 2 })
Thông báo này cho chúng tôi biết rằng ba tài liệu phù hợp với tiêu chí truy vấn (vì chúng tôi đã chọn tất cả tài liệu) và hai tài liệu đã được sửa đổi (vì hai tài liệu khớp với $pull
của chúng tôi tiêu chí).
Hãy kiểm tra lại bộ sưu tập để xem hiệu quả:
db.restaurants.find().pretty()
Kết quả:
{ "_id" : 1, "name" : "The Rat", "reviews" : [ ] } { "_id" : 2, "name" : "Yum Palace", "reviews" : [ { "name" : "Tom", "date" : "08 October, 2020", "ordered" : "Breakfast", "rating" : 4 } ] } { "_id" : 3, "name" : "Boardwalk Cafe", "reviews" : [ { "name" : "Steve", "date" : "20 December, 2020", "ordered" : "Breakfast", "rating" : 5 }, { "name" : "Lisa", "date" : "25 October, 2020", "ordered" : "Dinner", "rating" : 5 }, { "name" : "Kim", "date" : "21 October, 2020", "ordered" : "Dinner", "rating" : 5 } ] }
Chúng ta có thể thấy rằng chỉ còn lại các bài đánh giá có xếp hạng từ 4 trở lên. Tất cả các đánh giá dưới 4 đã bị xóa.