Trong MongoDB, khi bạn cập nhật tài liệu có chứa mảng, bạn có tùy chọn sử dụng arrayFilters
tham số.
arrayFilters
tham số cho phép bạn chỉ định một mảng tài liệu lọc để xác định phần tử mảng nào cần sửa đổi.
Trong tài liệu cập nhật, hãy sử dụng $[<identifier>]
toán tử vị trí được lọc, xác định các phần tử mảng phù hợp với arrayFilters
điều kiện cho hoạt động cập nhật.
Cú pháp
Cú pháp như sau:
{ <update operator>: { "<array>.$[<identifier>]" : value } },
{ arrayFilters: [ { <identifier>: <condition> } ] }
Ví dụ:khi được sử dụng với updateMany()
, nó sẽ như thế này:
db.collection.updateMany(
{ <query conditions> },
{ <update operator>: { "<array>.$[<identifier>]" : value } },
{ arrayFilters: [ { <identifier>: <condition> } ] }
)
Ví dụ
Giả sử chúng ta có một bộ sưu tập có tên là players
với các tài liệu sau:
{ "_id" : 1, "scores" : [ 1, 5, 17 ] } { "_id" : 2, "scores" : [ 8, 17, 18 ] } { "_id" : 3, "scores" : [ 15, 11, 8 ] }
Chúng tôi có thể sử dụng arrayFilters
để chỉ cập nhật những phần tử mảng có giá trị cao hơn một số lượng nhất định.
Ví dụ:
db.players.updateMany(
{ scores: { $gte: 10 } },
{ $set: { "scores.$[e]" : 10 } },
{ arrayFilters: [ { "e": { $gte: 10 } } ] }
)
Kết quả:
{ "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 }
Thông báo cho chúng tôi biết rằng ba tài liệu đã được khớp và sửa đổi.
Đây là giao diện của các tài liệu bây giờ.
db.players.find()
Kết quả:
{ "_id" : 1, "scores" : [ 1, 5, 10 ] } { "_id" : 2, "scores" : [ 8, 10, 10 ] } { "_id" : 3, "scores" : [ 10, 10, 8 ] }
Chúng ta có thể thấy rằng tất cả các giá trị trước đây lớn hơn hoặc bằng 10 bây giờ là 10.
Trong trường hợp này, tôi đã sử dụng e
với tư cách là <identifier>
. Lưu ý rằng <identifier>
phải bắt đầu bằng một chữ cái thường và chỉ chứa các ký tự chữ và số.