Có, hoàn toàn có thể sử dụng $addToSet nhiều lần trong cùng một lệnh cập nhật. Toán tử này thêm giá trị vào mảng chỉ khi giá trị đó chưa tồn tại.
Tạo collection mẫu:
> db.demo27.insertOne({"StudentDetails":{"101":{"Subject":["Java"]}}});
{ "acknowledged" : true, "insertedId" : ObjectId("5e15f9e822d07d3b95082e7f") }
> db.demo27.insertOne({"StudentDetails":{"101":{"Subject":["MySQL"]}}});
{ "acknowledged" : true, "insertedId" : ObjectId("5e15f9eb22d07d3b95082e80") }
Xem dữ liệu ban đầu:
> db.demo27.find().pretty();
{
"_id" : ObjectId("5e15f9e822d07d3b95082e7f"),
"StudentDetails" : { "101" : { "Subject" : [ "Java" ] } }
}
{
"_id" : ObjectId("5e15f9eb22d07d3b95082e80"),
"StudentDetails" : { "101" : { "Subject" : [ "MySQL" ] } }
}
Cập nhật thêm "MongoDB" vào mảng Subject của cả hai tài liệu (sử dụng update với upsert: true):
> db.demo27.update({}, {$addToSet: {"StudentDetails.101.Subject": "MongoDB"}}, {upsert: true})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Kết quả sau cập nhật:
> db.demo27.find().pretty();
{
"_id" : ObjectId("5e15f9e822d07d3b95082e7f"),
"StudentDetails" : { "101" : { "Subject" : [ "Java", "MongoDB" ] } }
}
{
"_id" : ObjectId("5e15f9eb22d07d3b95082e80"),
"StudentDetails" : { "101" : { "Subject" : [ "MySQL" ] } }
}
Chú ý: Lệnh update() mặc định chỉ cập nhật tài liệu đầu tiên khớp. Để cập nhật tất cả, thêm tùy chọn {multi: true} (phiên bản MongoDB < 4.0) hoặc sử dụng updateMany() (phiên bản mới hơn).