Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Toán tử đối lập của $addToSet là $pull trong MongoDB

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
$addToSetThêm vào mảngChỉ thêm nếu giá trị chưa có trong mảng
$pullXóa khỏi mảngXó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

  • $pull xó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, $pull so 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ả
$pushThêm phần tử (cho phép trùng)
$addToSetThêm phần tử (unique, không trùng)
$pullXóa phần tử khớp điều kiện
$pullAllXóa nhiều giá trị cụ thể
$popXóa phần tử đầu/cuối mảng
$push + $eachThêm nhiều phần tử cùng lúc