Trong MongoDB, $addToSet
toán tử thêm một giá trị vào một mảng trừ khi giá trị đó đã có trong mảng.
Nó tương tự như $push
toán tử, ngoại trừ $push
đó thêm giá trị ngay cả khi giá trị đã có.
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:
db.products.find()
Kết quả:
{ "_id" : 1, "product" : "Bat", "sizes" : [ "S", "M", "L" ] } { "_id" : 2, "product" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "product" : "Cap", "sizes" : [ "S", "M", "L", "XL" ] }
Chúng ta có thể sử dụng $addToSet
để nối một giá trị vào một trong các mảng đó.
Ví dụ:
db.products.update(
{ _id: 1 },
{ $addToSet: { sizes: "XL" } }
)
Đầu ra:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Hãy cùng xem xét bộ sưu tập của chúng tôi để xác minh sự thay đổi:
db.products.find()
Kết quả:
{ "_id" : 1, "product" : "Bat", "sizes" : [ "S", "M", "L", "XL" ] } { "_id" : 2, "product" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "product" : "Cap", "sizes" : [ "S", "M", "L", "XL" ] }
Giá trị trùng lặp
Nếu bạn cố gắng chèn một giá trị đã tồn tại trong mảng, không có gì xảy ra. Nói cách khác, $addToSet
chỉ chèn giá trị nếu nó chưa tồn tại.
Dưới đây là một ví dụ về việc cố gắng chèn một giá trị đã tồn tại.
db.products.update(
{ _id: 1 },
{ $addToSet: { sizes: "XL" } }
)
Đầu ra:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
Thông báo này cho chúng tôi biết rằng có một tài liệu phù hợp (tức là tài liệu có _id
trong tổng số 1
), nhưng không có sửa đổi.
Trong ví dụ trước, chúng ta đã thấy "nModified" : 1
, nhưng trong ví dụ này, chúng ta thấy "nModified" : 0
. Đó là bởi vì giá trị không tồn tại khi chúng tôi chèn nó vào ví dụ trước, nhưng trong ví dụ này, nó đã tồn tại.
Chúng tôi có thể xác minh điều này bằng cách xem lại bộ sưu tập:
db.products.find()
Kết quả:
{ "_id" : 1, "product" : "Bat", "sizes" : [ "S", "M", "L", "XL" ] } { "_id" : 2, "product" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "product" : "Cap", "sizes" : [ "S", "M", "L", "XL" ] }
Thêm nhiều giá trị
Bạn có thể sử dụng $each
công cụ sửa đổi để nối nhiều giá trị vào một mảng.
Ví dụ:
db.products.update(
{ _id: 2 },
{
$addToSet: {
sizes: {
$each: [ "XXL", "XXXL" ]
}
}
}
)
Đầ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, "product" : "Bat", "sizes" : [ "S", "M", "L", "XL" ] } { "_id" : 2, "product" : "Hat", "sizes" : [ "S", "L", "XL", "XXL", "XXXL" ] } { "_id" : 3, "product" : "Cap", "sizes" : [ "S", "M", "L", "XL" ] }
Chúng ta có thể thấy rằng hai giá trị đã được nối vào mảng trong tài liệu 2 như mong đợi.
Thêm một mảng vào mảng
Bạn cũng có thể nối toàn bộ một mảng vào mảng. Khi bạn làm điều này, toàn bộ mảng sẽ được thêm vào như một mảng riêng biệt của riêng nó.
Giả sử chúng ta có một bộ sưu tập như thế này:
db.foo.find()
Kết quả:
{ "_id" : 1, "bar" : [ 1, 5, 3 ] } { "_id" : 2, "bar" : [ 8, 17, 18 ] } { "_id" : 3, "bar" : [ 15, 11, 8 ] }
Chúng ta có thể nối một mảng vào một mảng như sau:
db.foo.update(
{ _id: 1 },
{ $addToSet: { bar: [ 7, 8, 9] } }
)
Đầu ra:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Kiểm tra bộ sưu tập:
db.foo.find()
Kết quả:
{ "_id" : 1, "bar" : [ 1, 5, 3, [ 7, 8, 9 ] ] } { "_id" : 2, "bar" : [ 8, 17, 18 ] } { "_id" : 3, "bar" : [ 15, 11, 8 ] }