Khi gặp đ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 đã đi đến 2 cách để phá vỡ này xuống. Những điều cần xem xét khi đối phó với sự di cư của dữ liệu trong MongoDB (không phải tất cả mà hiếm từ RDBs) là:
- Đảm bảo môi trường kiểm tra địa phương không phá vỡ khi một nhà phát triển kết hợp mới nhất từ kho dự án
- Đảm bảo bất kỳ 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 xác thực được sử dụng. (Tất nhiên nếu mọi người được tự động đăng xuất khi nâng cấp được thực hiện, thì chỉ đáng lo ngại 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ẽ ghi nhật ký mọi người hoặc thời gian ngừng ứng dụng thì cách đơn giản để thực hiện điều này là có tập lệnh di chuyển để kết nối với MongoDB cục bộ hoặc 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 đối tượng có tên họ và gia đình (rất cơ bản tất nhiên và sẽ cần phải được đưa vào tập lệnh để chạy cho tất 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ẽ là ít gánh nặng cho một máy chủ sống và không yêu cầu thời gian xuống do chỉ nâng cấp người dùng khi họ sử dụng các phiên bản nâng cấp/hạ cấp lần đầu tiên.
Nếu sử dụng middleware của bạn trong Expressjs cho Nodejs:
- Đặt một biến ứng dụng trong kịch bản ứng dụng gốc của bạn qua
app.set('schemaVersion', 1)
mà sẽ được sử dụng sau này để so sánh với phiên bản sử dụng giản đồ.
- Bây giờ, đảm bảo tất cả các lược đồ người dùng đều 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 middleware đơn giản để phát hiện các cấu hình và sử dụng phiên bản
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 các bản nâng cấp/hạ cấp tôi sẽ làm cho các file js đơn giản dưới một thư mục di cư với một bản nâng cấp/hạ cấp chức năng xuất khẩu 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 đảm bảo 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 họ chuyển sang phiên bản khác một lần nữa.
Nguồn
2014-03-17 00:03:18
Xin chào, bạn đã giải quyết được vấn đề này chưa. Tôi đã kết nối với MongoDB bằng cách sử dụng mongoose và không muốn thực hiện di chuyển. – Xdrone
Tôi đã đăng một ví dụ đơn giản trong đó logic hoạt động trong môi trường địa phương/trực tiếp. –