Để 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: ... }].