Khi hiểu được điều này và hiểu một cách hợp lý cách di chuyển hoạt động trên cơ sở dữ liệu quan hệ, MongoDB làm cho việc này đơn giản hơn một chút. Tôi đã có 2 cách để giải quyết vấn đề này. Những điều cần xem xét khi xử lý việc di chuyển dữ liệu trong MongoDB (không phải tất cả những điều không phổ biến từ RDB) là:
- Đảm bảo môi trường thử nghiệm cục bộ không bị phá vỡ khi nhà phát triển hợp nhất bản mới nhất từ kho dự án
- Đảm bảo mọi dữ liệu được cập nhật chính xác trên phiên bản trực tiếp bất kể người dùng đăng nhập hay đăng xuất nếu sử dụng xác thực. (Tất nhiên nếu mọi người tự động đăng xuất khi nâng cấp thì chỉ cần lo lắng về thời điểm người dùng đăng nhập là cần thiết).
1) Nếu thay đổi của bạn sẽ đăng xuất mọi người hoặc dự kiến thời gian ngừng ứng dụng thì cách đơn giản để thực hiện việc này là có một tập lệnh di chuyển để kết nối với MongoDB cục bộ hoặc trực tiếp và nâng cấp dữ liệu chính xác. Ví dụ trong đó tên của người dùng được thay đổi từ một chuỗi đơn thành một đối tượng có họ và tên đã cho (tất nhiên là rất cơ bản và sẽ cần được đưa vào tập lệnh để chạy cho tất cả các nhà phát triển):
Sử dụng CLI:
mongod
use myDatabase
db.myUsers.find().forEach( function(user){
var curName = user.name.split(' '); //need some more checks..
user.name = {given: curName[0], family: curName[1]};
db.myUsers.save( user );
})
2) Bạn muốn ứng dụng di chuyển các lược đồ lên và xuống dựa trên phiên bản ứng dụng mà chúng đang chạy. Điều này rõ ràng sẽ ít gánh nặng hơn đối với một máy chủ trực tiếp và không yêu cầu thời gian ngừng hoạt động do chỉ nâng cấp người dùng khi họ sử dụng phiên bản nâng cấp / hạ cấp lần đầu tiên.
Nếu bạn sử dụng phần mềm trung gian trong Expressjs cho Nodejs:
- Đặt một biến ứng dụng trong tập lệnh ứng dụng gốc của bạn qua
app.set('schemaVersion', 1)
sẽ được sử dụng sau này để so sánh với phiên bản giản đồ của người dùng. - Bây giờ, hãy đảm bảo rằng tất cả các lược đồ người dùng cũng có thuộc tính schemaVersion để chúng tôi có thể phát hiện sự thay đổi giữa phiên bản lược đồ ứng dụng và các lược đồ MongoDB hiện tại chỉ dành cho NGƯỜI DÙNG THAM GIA ĐÓ.
-
Tiếp theo, chúng ta cần tạo phần mềm trung gian đơn giản để phát hiện cấu hình và phiên bản người dùng
app.use( function( req, res, next ){ //If were not on an authenticated route if( ! req.user ){ next(); return; } //retrieving the user info will be server dependent if( req.user.schemaVersion === app.get('schemaVersion')){ next(); return; } //handle upgrade if user version is less than app version //handle downgrade if user version is greater than app version //save the user version to your session / auth token / MongoDB where necessary })
Đối với nâng cấp / hạ cấp, tôi sẽ tạo các tệp js đơn giản trong thư mục di chuyển với chức năng xuất nâng cấp / hạ cấp sẽ chấp nhận mô hình người dùng và chạy các thay đổi di chuyển trên người dùng cụ thể đó trong MongoDB. Cuối cùng, hãy đảm bảo rằng phiên bản người dùng được cập nhật trong MongoDB của bạn để họ không chạy lại các thay đổi trừ khi chuyển sang một phiên bản khác.