2012-04-28 12 views
22

Làm cách nào để bạn thực hiện di chuyển cơ sở dữ liệu bằng Meteor? Với Ruby on Rails có ActiveRecord :: Migration. Có một cơ chế tương đương trong Meteor không?Meteor cách thực hiện di chuyển cơ sở dữ liệu?

Ví dụ: tôi tạo ứng dụng với một số dữ liệu người dùng. Tôi đang lưu trữ dữ liệu ở Mongo bằng định dạng JSON. Thay đổi ứng dụng và lược đồ cơ sở dữ liệu JSON cần phải thay đổi. Tôi có thể viết một phương pháp di chuyển để thay đổi giản đồ, tuy nhiên, tôi chỉ muốn điều này chạy nếu cơ sở dữ liệu máy chủ đã lỗi thời.

Trả lời

35

Không có gì được tích hợp sẵn cho việc này. Những gì tôi đã làm cho bản thân mình bây giờ là tương tự như cách Rails hoạt động, nhưng là một phần của khởi động thay vì một nhiệm vụ riêng biệt. Đầu tiên tạo ra một Meteor.Collection được gọi là di chuyển, và sau đó cho mỗi di cư rời rạc, tạo ra một chức năng dưới thư mục con server chạy khi khởi động. Nó chỉ nên chạy di chuyển nếu nó chưa chạy trước đó và nó sẽ gắn cờ di chuyển trong bộ sưu tập di chuyển khi nó được thực hiện.

// database migrations 
Migrations = new Meteor.Collection('migrations'); 

Meteor.startup(function() { 
    if (!Migrations.findOne({name: "addFullName"})) { 
    Users.find().forEach(function (user) { 
     Users.update(user._id, {$set: {fullname: users.firstname + ' ' + users.lastname}}); 
    }); 
    Migrations.insert({name: "addFullName"}); 
    } 
}); 

Bạn có thể mở rộng kỹ thuật này để hỗ trợ xuống di cư (tìm kiếm sự tồn tại của một sự chuyển đổi nhất định và đảo ngược nó), thực thi một thứ tự sắp xếp trên đường di cư, và chia từng di cư vào một tập tin riêng biệt nếu bạn muốn.

Thật thú vị khi nghĩ về một gói thông minh để tự động hóa việc này.

+0

Cuối cùng tôi có thể có động lực để tạo một gói thông minh với logic này. Điều này vẫn tốt hơn một phương pháp Meteor tối nghĩa. – wizonesolutions

+0

Nếu bạn có nhiều máy chủ chạy trên cùng cơ sở dữ liệu (nhiều máy chủ web hoặc dịch vụ vi mô), bạn có thể gặp sự cố khi 5 máy chủ chạy cùng một truy vấn. Gói này dường như sử dụng [cơ chế khóa] (https://github.com/percolatestudio/meteor-migrations/blob/master/migrations_server.js#L159) –

4

Tôi đã tạo gói thông minh cho trường hợp sử dụng này.
Xem https://atmosphere.meteor.com/package/migrations

+5

Ngoài ra còn có https://github.com/percolatestudio/meteor- di chuyển mà dường như tôi có thiết kế sạch hơn https://github.com/rantav/meteor-migrations. –

5

Như Aram đã nêu trong nhận xét, p ercolate:migrations gói mang đến cho bạn những gì bạn cần. Mẫu

Migrations.add({ 
    version: 1, 
    name: 'Adds pants to some people in the db.', 
    up: function() {//code to migrate up to version 1} 
    down: function() {//code to migrate down to version 0} 
}); 

Migrations.add({ 
    version: 2, 
    name: 'Adds a hat to all people in the db who are wearing pants.', 
    up: function() {//code to migrate up to version 2} 
    down: function() {//code to migrate down to version 1} 
});