Đây không phải là thao tác mapReduce, không phải trừ khi bạn muốn một tập hợp mới chỉ bao gồm _id
và giá trị value
các trường được tạo từ đầu ra mapReduce, giống như:
"_id": ObjectId("53f2b954b55e91756c81d3a5"),
"value": {
"domain": "example.com",
...
}
}
Tốt nhất là một loại "phía máy chủ" làm lại bộ sưu tập của bạn, nhưng tất nhiên không phải theo cấu trúc bạn muốn.
Mặc dù có nhiều cách để thực thi tất cả mã trong máy chủ, vui lòng không cố gắng làm như vậy trừ khi bạn thực sự ở trong tình trạng khó khăn. Những cách này thường không hoạt động tốt với sharding, thường là nơi mọi người "thực sự có mặt" đối với kích thước tuyệt đối của bản ghi.
Khi bạn muốn thay đổi mọi thứ và thực hiện hàng loạt, bạn thường phải "lặp" các kết quả thu thập và xử lý các bản cập nhật trong khi có quyền truy cập vào thông tin tài liệu hiện tại. Đó là, trong trường hợp "cập nhật" của bạn "dựa trên" thông tin đã có trong các trường hoặc cấu trúc của tài liệu.
Do đó, không có thao tác "thay thế regex" và chắc chắn không có thao tác nào để đổi tên trường. Vì vậy, hãy lặp lại với hoạt động hàng loạt cho hình thức "an toàn nhất" để thực hiện việc này mà không cần chạy tất cả mã trên máy chủ.
var bulk = db.collection.initializeOrderedBulkOp();
var counter = 0;
db.collection.find().forEach(function(doc) {
for ( var k in doc ) {
if ( doc[k].match(/^2014.*/) ) {
var update = {};
update["$unset"][k] = 1;
update["$set"][ k.replace(/(\d+)-(\d+)-(\d+).+/,"$1$2$3") ] = doc[k];
bulk.find({ "_id": doc._id }).updateOne(update);
counter++;
}
}
if ( counter % 1000 == 0 ) {
bulk.execute();
bulk = db.collection.initializeOrderedBulkOp();
}
});
if ( counter % 1000 != 0 )
bulk.execute();
Vì vậy, những điều chính ở đó là $unset
toán tử để xóa trường hiện có và $set
toán tử để tạo trường mới trong tài liệu. Bạn cần nội dung tài liệu để kiểm tra và sử dụng cả "tên trường" và "giá trị", do đó, không có cách nào khác lặp lại.
Nếu bạn không có MongoDB 2.6 trở lên trên máy chủ thì khái niệm lặp lại vẫn còn mà không mang lại lợi ích hiệu suất tức thì. Bạn có thể xem xét những thứ như .eval()
để xử lý trên máy chủ, nhưng như tài liệu cho thấy, nó thực sự không được khuyến khích. Hãy sử dụng một cách thận trọng nếu bạn phải.