Tôi đang trong quá trình thay đổi lược đồ cho một trong các bộ sưu tập MongoDB của tôi. (Tôi đã lưu trữ ngày tháng dưới dạng chuỗi và giờ ứng dụng của tôi lưu trữ chúng là ISODate
s; tôi cần phải quay lại và thay đổi tất cả các bản ghi cũ để sử dụng số ISODate
.) Tôi nghĩ mình biết cách thực hiện việc này bằng cách sử dụng bản cập nhật , nhưng kể từ khi hoạt động này sẽ ảnh hưởng đến hàng chục ngàn hồ sơ tôi do dự để phát hành một hoạt động mà tôi không chắc chắn 100% sẽ làm việc. Có cách nào để làm một "chạy khô" của một bản cập nhật sẽ cho tôi thấy, đối với một số lượng nhỏ hồ sơ, bản ghi gốc và cách nó sẽ bị thay đổi?Có cách nào để thực hiện "chạy khô" của một hoạt động cập nhật không?
Edit: tôi đã kết thúc sử dụng phương pháp của việc thêm một lĩnh vực mới để mỗi bản ghi, và sau đó (sau khi xác minh rằng các dữ liệu đã đúng) đổi tên trường để phù hợp với bản gốc. Nó trông như thế này:
db.events.find({timestamp: {$type: 2}})
.forEach(function (e) {
e.newTimestamp = new ISODate(e.timestamp);
db.events.save(e);
})
db.events.update({},
{$rename: {'newTimestamp': 'timestamp'}},
{multi: true})
Bằng cách này, phương pháp chuyển đổi chuỗi thời gian thành ISODate
s là những gì đã kết thúc. (Tôi đã có ý tưởng từ this SO answer.)
Lời khuyên của tôi là thêm ISODate làm trường mới. Sau khi xác nhận rằng tất cả có vẻ tốt, bạn có thể bỏ đặt ngày chuỗi. –
@JamesWahlin Có ý tưởng đúng, ngay cả trong SQL hỗ trợ chạy khô tôi sẽ không làm điều này – Sammaye
@ JamesWahlin Bạn có thể thêm bình luận của bạn như là một câu trả lời? – bdesham