2013-08-18 23 views
17

Tôi hoàn toàn mới với MongoDB & Mongoose và dường như không thể tìm thấy câu trả lời về cách xử lý di chuyển khi thay đổi lược đồ.Cách xử lý đúng cách di chuyển giản đồ mongoose?

Tôi đang sử dụng để chạy di chuyển các tập lệnh SQL thay đổi cấu trúc bảng và bất kỳ dữ liệu cơ bản nào cần được thay đổi. Điều này thường liên quan đến thời gian chết của DB.

Cách này thường được xử lý trong MongoDB/Mongoose? Gotcha nào mà tôi cần phải biết?

+0

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

+0

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

Trả lời

13

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.

+1

Điều này có nghĩa là bạn có thể có một hàm trung gian cho mỗi lược đồ trong MongoDB? Hiệu suất hoặc sự cân bằng khác với phương pháp này là gì? – Peter

2

Nếu bạn quen với việc di chuyển kiểu SQL hoặc di chuyển giống như Rails thì bạn sẽ tìm thấy công cụ cli của mình migrate-mongoose phù hợp với bạn.

Nó cho phép bạn viết di chuyển với up và chức năng down và quản lý trạng thái cho bạn dựa trên thành công và thất bại của việc di chuyển của bạn.

Nó cũng hỗ trợ ES6 nếu bạn đang sử dụng cú pháp ES 2015.

Bạn có quyền truy cập vào các mẫu mongoose của mình thông qua đối tượng this, giúp bạn dễ dàng thực hiện các thay đổi bạn cần cho mô hình và lược đồ của mình.

0

Có 2 loại di cư:

  • tuyến: Sẽ yêu cầu bạn phải đưa dịch vụ của bạn xuống để bảo trì, sau đó lặp qua các bộ sưu tập và đưa ra những thay đổi mà bạn cần.

  • Trực tuyến: Không yêu cầu giảm dịch vụ của bạn để bảo trì. Khi bạn đọc tài liệu, bạn kiểm tra phiên bản của nó và chạy một phiên bản di chuyển cụ thể của phiên bản cho mỗi phiên bản giữa cũ và mới. Sau đó, bạn tải kết quả.

Không phải tất cả dịch vụ đều có khả năng di chuyển ngoại tuyến, tôi khuyên bạn nên tiếp cận trực tuyến.