2013-05-17 26 views
9

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.)

+1

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. –

+0

@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

+0

@ 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

Trả lời

3

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.

4

Tạo môi trường thử nghiệm với cấu trúc cơ sở dữ liệu của bạn. Sao chép một số ít các bản ghi vào nó. Đã giải quyết được sự cố. Không phải là giải pháp bạn đang tìm kiếm, tôi chắc chắn. Nhưng, tôi tin, đây là hoàn cảnh chính xác mà một 'môi trường thử nghiệm' nên được sử dụng cho.

+0

Tôi đã nghĩ về điều đó. Nhưng nếu nỗ lực đầu tiên của tôi không hoạt động, tôi phải xóa môi trường phát triển và nhập lại dữ liệu - có khả năng nhiều lần - và điều đó dường như là một rắc rối mà tôi có thể tránh được. – bdesham

+0

Vâng, tôi cho rằng đã được xem xét, chỉ nghĩ rằng tôi muốn ném gợi ý ra khỏi đó, dù sao ... đôi khi tôi bỏ qua những thứ đơn giản đôi khi, bản thân mình. – eidsonator

2

Chọn ID của các bản ghi cụ thể mà bạn muốn theo dõi. đặt trong số update{_id:{$in:[<your monitored id>]}}

+0

Đó là một cách tiếp cận, mặc dù nó vẫn mở ra khả năng hủy dữ liệu nếu tôi làm hỏng hoạt động cập nhật. – bdesham

+2

@bdesham thực tiễn không tốt là thử nghiệm với dữ liệu trực tiếp mà không cần sao lưu. Đó là quy tắc ngón tay cái cho bất kỳ thao tác sản xuất nào - tạo điểm rollback trước – Dewfy

0

Tùy chọn khác phụ thuộc vào số tiền trên nó sẽ gây ra cho bạn - Bạn có thể xem xét viết tập lệnh, thực hiện thao tác tìm, thêm bản in hoặc chạy trong khi gỡ lỗi trong khi thao tác lưu được nhận xét. Khi bạn đã đạt được sự tự tin, bạn có thể áp dụng thao tác lưu.

var changesLog = []; 
var errorsLog = []; 
events.find({timestamp: {$type: 2}}, function (err, events) { 
    if (err) { 
     debugger; 
     throw err; 
    } else { 
     for (var i = 0; i < events.length; i++) { 
      console.log('events' + i +"/"+(candidates.length-1)); 
      var currentEvent = events[i]; 
      var shouldUpdateCandidateData = false; 

      currentEvent.timestamp = new ISODate(currentEvent.timestamp); 


      var change = currentEvent._id; 
      changesLog.push(change); 

      // // ** Dry Run ** 
      //  currentEvent.save(function (err) { 
      //   if (err) { 
      //    debugger; 
      //    errorsLog.push(currentEvent._id + ", " + currentEvent.timeStamp + ', ' + err); 
      //    throw err; 
      //   } 
      //  }); 
     } 
     console.log('Done'); 
     console.log('Changes:'); 
     console.log(changesLog); 
     console.log('Errors:'); 
     console.log(errorsLog); 
     return; 
    } 
}); 
Các vấn đề liên quan