Để sao chép giá trị từ một trường sang trường khác trong cùng tài liệu MongoDB, bạn có thể sử dụng forEach() kết hợp save() (hoặc updateOne() hiện đại hơn) để duyệt qua từng tài liệu và gán giá trị.
1. Tạo bộ sưu tập và chèn dữ liệu
> db.demo51.insert({ "Name1": "Chris", "Name": "David", "Age": 24 });
> db.demo51.insert({ "Name1": "Carol", "Name": "Mike", "Age": 22 });
> db.demo51.insert({ "Name1": "Sam", "Name": "Bob", "Age": 26 });
2. Xem dữ liệu ban đầu
> db.demo51.find();
Kết quả:
{ "_id": ObjectId("..."), "Name1": "Chris", "Name": "David", "Age": 24 }
{ "_id": ObjectId("..."), "Name1": "Carol", "Name": "Mike", "Age": 22 }
{ "_id": ObjectId("..."), "Name1": "Sam", "Name": "Bob", "Age": 26 }
3. Sao chép giá trị từ Name sang Name1
> db.demo51.find().forEach(function(d) {
d.Name1 = d.Name;
db.demo51.save(d);
});
Cách hiện đại hơn (MongoDB 3.2+): Sử dụng updateMany() với pipeline (MongoDB 4.2+):
> db.demo51.updateMany(
{},
[{ $set: { Name1: "$Name" } }]
);
4. Kết quả sau cập nhật
> db.demo51.find();
Kết quả:
{ "_id": ObjectId("..."), "Name1": "David", "Name": "David", "Age": 24 }
{ "_id": ObjectId("..."), "Name1": "Mike", "Name": "Mike", "Age": 22 }
{ "_id": ObjectId("..."), "Name1": "Bob", "Name": "Bob", "Age": 26 }
Lưu ý: save() đã deprecated, nên dùng replaceOne() hoặc updateOne() với _id trong vòng lặp, hoặc tốt nhất là dùng updateMany() với aggregation pipeline như trên để hiệu suất cao hơn.