Đối với những gì nó đáng giá, mặc dù nghe có vẻ khủng khiếp khi phải làm, nhưng giải pháp thực sự khá dễ dàng. Điều này tất nhiên phụ thuộc vào số lượng hồ sơ bạn có. Nhưng đây là ví dụ của tôi:
db.Setting.find({ 'Value.Tiers.0.AssetsUnderManagement': { $exists: 1 } }).snapshot().forEach(function(item)
{
for(i = 0; i != item.Value.Tiers.length; ++i)
{
item.Value.Tiers[i].Aum = item.Value.Tiers[i].AssetsUnderManagement;
delete item.Value.Tiers[i].AssetsUnderManagement;
}
db.Setting.update({_id: item._id}, item);
});
Tôi lặp lại bộ sưu tập của mình nơi tìm thấy mảng và tìm thấy tên "sai". Sau đó, tôi lặp lại bộ sưu tập phụ, đặt giá trị mới, xóa giá trị cũ và cập nhật toàn bộ tài liệu. Nó tương đối không đau. Cứ cho là tôi chỉ có vài chục nghìn hàng để tìm kiếm, trong đó chỉ có vài chục hàng đáp ứng tiêu chí.
Tuy nhiên, tôi hy vọng câu trả lời này sẽ giúp ích cho ai đó!
Chỉnh sửa:Đã thêm snapshot()
cho truy vấn. Xem lý do tại sao trong phần bình luận.
Bạn phải áp dụng
snapshot()
vào con trỏ trước khi truy xuất bất kỳ tài liệu nào từ cơ sở dữ liệu. Bạn chỉ có thể sử dụngsnapshot()
với các bộ sưu tập chưa được lưu trữ.
Từ MongoDB 3.4, snapshot()
chức năng đã bị loại bỏ. Vì vậy, nếu sử dụng Mongo 3.4+, ví dụ trên sẽ xóa snapshot()
chức năng.