Trong MongoDB, bạn có thể sử dụng $pullAll
toán tử để xóa tất cả các trường hợp của các giá trị được chỉ định khỏi một mảng hiện có.
Sử dụng $pullAll
kết hợp với một phương thức như update()
, updateOne()
hoặc updateMany()
để cập nhật / các 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 với các tài liệu sau:
{ "_id" : 1, "bar" : [ 1, 7, 2, 3, 8, 7, 1 ] } { "_id" : 2, "bar" : [ 0, 1, 8, 17, 18, 8 ] } { "_id" : 3, "bar" : [ 15, 11, 8, 0, 1, 3 ] }
Và giả sử chúng tôi muốn xóa tất cả các giá trị của 7
từ mảng trong tài liệu 1.
Chúng tôi có thể làm điều này:
db.foo.update(
{ _id: 1 },
{ $pullAll: { bar: [ 7 ] } }
)
Đầ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.foo.find()
Kết quả:
{ "_id" : 1, "bar" : [ 1, 2, 3, 8, 1 ] } { "_id" : 2, "bar" : [ 0, 1, 8, 17, 18, 8 ] } { "_id" : 3, "bar" : [ 15, 11, 8, 0, 1, 3 ] }
Chúng ta có thể thấy rằng mảng trong tài liệu 1 đã có tất cả 7
các giá trị đã bị xóa như đã chỉ định.
Xóa nhiều giá trị
Đối số mà chúng tôi đã cung cấp cho $pullAll
là một mảng và do đó chúng tôi có thể xóa nhiều giá trị bằng cách phân tách chúng bằng dấu phẩy.
Ví dụ:
db.foo.update(
{ _id: 2 },
{ $pullAll: { bar: [ 17, 18 ] } }
)
Đầ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.foo.find()
Kết quả:
{ "_id" : 1, "bar" : [ 1, 2, 3, 8, 1 ] } { "_id" : 2, "bar" : [ 0, 1, 8, 8 ] } { "_id" : 3, "bar" : [ 15, 11, 8, 0, 1, 3 ] }
Chúng ta có thể thấy rằng các giá trị 17
và 18
đã bị xóa khỏi mảng trong tài liệu 2.
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.foo.update(
{ },
{ $pullAll: { bar: [ 1, 8 ] } },
{ multi: true }
)
Đầu ra:
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })
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) và cả ba đều đã được sửa đổi (vì tất cả chúng đều chứa các giá trị được chỉ định).
Hãy kiểm tra lại bộ sưu tập:
db.foo.find()
Kết quả:
{ "_id" : 1, "bar" : [ 2, 3 ] } { "_id" : 2, "bar" : [ 0 ] } { "_id" : 3, "bar" : [ 15, 11, 0, 3 ] }
Chúng tôi có thể thấy rằng tất cả các phiên bản đã được cập nhật như đã chỉ định.