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

Sao chép giá trị thuộc tính (copy field) trong MongoDB

Để sao chép giá trị từ một trường sang trường khác trong cùng tài liệu MongoDB, cách hiện đại và hiệu quả nhất (MongoDB 4.2+) là sử dụng **Aggregation Pipeline trong updateMany()** với $set. Cách cũ dùng forEach() + save() chậm và đã deprecated.

1. Tạo bộ sưu tập và chèn dữ liệu

> db.demo55.insertOne({ "ShippingDate": "", "date": new ISODate("2019-01-21") });
> db.demo55.insertOne({ "ShippingDate": "", "date": new ISODate("2020-05-12") });

2. Xem dữ liệu ban đầu (ShippingDate rỗng)

> db.demo55.find();

Kết quả:

{ "_id": ObjectId("..."), "ShippingDate": "", "date": ISODate("2019-01-21T00:00:00Z") }
{ "_id": ObjectId("..."), "ShippingDate": "", "date": ISODate("2020-05-12T00:00:00Z") }

3. Cách hiện đại (MongoDB 4.2+): updateMany với Pipeline

> db.demo55.updateMany(
    {},
    [{ $set: { ShippingDate: "$date" } }]
);

Ưu điểm: Atomic, nhanh, không cần vòng lặp client-side, chạy hoàn toàn server-side.

4. Cách cũ (forEach + save - không khuyến khích)

> db.demo55.find().forEach(function(c) {
    db.demo55.update({ _id: c._id }, { $set: { ShippingDate: c.date } });
});

5. Kết quả (cả 2 cách)

{ "_id": ObjectId("..."), "ShippingDate": ISODate("2019-01-21T00:00:00Z"), "date": ISODate("2019-01-21T00:00:00Z") }
{ "_id": ObjectId("..."), "ShippingDate": ISODate("2020-05-12T00:00:00Z"), "date": ISODate("2020-05-12T00:00:00Z") }

Lưu ý: Nếu MongoDB < 4.2, dùng updateMany({}, { $set: { ShippingDate: "$date" } }) **KHÔNG** hoạt động (chỉ gán chuỗi "$date"). Bắt buộc dùng pipeline [{ $set: ... }].