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

Cập nhật tất cả document khớp ID cụ thể với updateMany MongoDB

Cập nhật hàng loạt document theo danh sách _id với updateMany()

updateMany() cập nhật tất cả document khớp filter. Kết hợp với $in để cập nhật nhiều _id cùng lúc.

1. Dữ liệu mẫu

> db.demo476.insertOne({ _id: 1, Name: "Chris" });
> db.demo476.insertOne({ _id: 2, Name: "David" });
> db.demo476.insertOne({ _id: 3, Name: "Bob" });
> db.demo476.insertOne({ _id: 4, Name: "Carol" });

2. Cập nhật _id 1 và 3: Name → "Robert"

> db.demo476.updateMany(
    { _id: { $in: [1, 3] } },
    { $set: { Name: "Robert" } }
);
{ "acknowledged": true, "matchedCount": 2, "modifiedCount": 2 }

3. Kết quả

> db.demo476.find();
{ "_id": 1, "Name": "Robert" }
{ "_id": 2, "Name": "David" }
{ "_id": 3, "Name": "Robert" }
{ "_id": 4, "Name": "Carol" }

Các pattern filter thường dùng với updateMany

FilterMô tả
{ _id: { $in: [1,3,5] } }Cập nhật danh sách ID cụ thể
{ status: "pending" }Cập nhật tất cả trạng thái pending
{ createdAt: { $lt: ISODate("2024-01-01") } }Cập nhật document cũ hơn ngày X
{ $or: [{type: "A"}, {type: "B"}] }Cập nhật nhiều loại
{ tags: { $in: ["vip", "premium"] } }Cập nhật có tag đặc biệt

Lưu ý quan trọng

  • Atomic per document: Mỗi document cập nhật atomic, nhưng toàn bộ operation không atomic
  • matchedCount vs modifiedCount: matched = số doc khớp filter, modified = số doc thực sự thay đổi giá trị
  • Không có rollback: Nếu lỗi giữa chừng, các doc đã cập nhật không tự revert
  • Write Concern: Mặc định w:1 (acknowledged). Có thể tăng w: "majority" cho an toàn

Ví dụ an toàn với write concern

db.demo476.updateMany(
    { _id: { $in: [1, 3] } },
    { $set: { Name: "Robert", updatedAt: new Date() } },
    { writeConcern: { w: "majority", wtimeout: 5000 } }
);

So sánh updateOne vs updateMany vs replaceMany

// updateOne: Chỉ 1 doc (đầu tiên khớp)
db.coll.updateOne(filter, update);

// updateMany: TẤT CẢ doc khớp
db.coll.updateMany(filter, update);

// replaceMany: KHÔNG CÓ. Chỉ có replaceOne.
// Muốn replace nhiều → dùng updateMany với $set toàn bộ field (không khuyến khích)