Trong MongoDB, $addToSet thêm giá trị vào mảng nếu chưa tồn tại. Toán tử đối lập (xóa giá trị khỏi mảng) là $pull.
So sánh
| Toán tử | Hành động | Điều kiện |
|---|---|---|
$addToSet | Thêm vào mảng | Chỉ thêm nếu giá trị chưa có trong mảng |
$pull | Xóa khỏi mảng | Xóa tất cả phần tử khớp điều kiện |
Ví dụ minh họa
Tạo collection và dữ liệu
> db.oppositeAddToSetDemo.insertOne({"StudentName":"John","StudentHobby":["Cricket","Cooking","Drawing"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8eddcc2f684a30fbdfd588") }
> db.oppositeAddToSetDemo.insertOne({"StudentName":"Carol","StudentHobby":["Cricket","Dance","Hiking"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8eddfd2f684a30fbdfd589") }
> db.oppositeAddToSetDemo.insertOne({"StudentName":"David","StudentHobby":["Learning","Photography"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8ede272f684a30fbdfd58a") }
Xem dữ liệu ban đầu
> db.oppositeAddToSetDemo.find().pretty();
{
"_id" : ObjectId("5c8eddcc2f684a30fbdfd588"),
"StudentName" : "John",
"StudentHobby" : [ "Cricket", "Cooking", "Drawing" ]
}
{
"_id" : ObjectId("5c8eddfd2f684a30fbdfd589"),
"StudentName" : "Carol",
"StudentHobby" : [ "Cricket", "Dance", "Hiking" ]
}
{
"_id" : ObjectId("5c8ede272f684a30fbdfd58a"),
"StudentName" : "David",
"StudentHobby" : [ "Learning", "Photography" ]
}
Xóa "Cooking" khỏi mảng StudentHobby của John
> db.oppositeAddToSetDemo.update(
{"StudentName": "John"},
{$pull: {"StudentHobby": "Cooking"}}
);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Kiểm tra kết quả
> db.oppositeAddToSetDemo.find().pretty();
{
"_id" : ObjectId("5c8eddcc2f684a30fbdfd588"),
"StudentName" : "John",
"StudentHobby" : [ "Cricket", "Drawing" ]
}
{
"_id" : ObjectId("5c8eddfd2f684a30fbdfd589"),
"StudentName" : "Carol",
"StudentHobby" : [ "Cricket", "Dance", "Hiking" }
}
{
"_id" : ObjectId("5c8ede272f684a30fbdfd58a"),
"StudentName" : "David",
"StudentHobby" : [ "Learning", "Photography" ]
}
Giá trị "Cooking" đã bị xóa khỏi mảng của John.
Các biến thể của $pull
// Xóa theo giá trị chính xác
{ $pull: { tags: "mongodb" } }
// Xóa object trong mảng theo điều kiện
{ $pull: { items: { status: "completed" } } }
// Xóa nhiều giá trị
{ $pull: { tags: { $in: ["old", "deprecated", "temp"] } } }
// Xóa theo điều kiện số
{ $pull: { scores: { $lt: 60 } } }
Lưu ý quan trọng
$pullxóa tất cả phần tử khớp, không chỉ phần tử đầu tiên- Nếu mảng chứa object,
$pullso sánh toàn bộ object (cần khớp hết các trường) - Để xóa object trong mảng theo 1 trường:
{ $pull: { array: { field: value } } } - Không có toán tử "$removeFromSet" chính thức trong MongoDB
Toán tử liên quan đến mảng
| Toán tử | Mô tả |
|---|---|
$push | Thêm phần tử (cho phép trùng) |
$addToSet | Thêm phần tử (unique, không trùng) |
$pull | Xóa phần tử khớp điều kiện |
$pullAll | Xóa nhiều giá trị cụ thể |
$pop | Xóa phần tử đầu/cuối mảng |
$push + $each | Thêm nhiều phần tử cùng lúc |