2013-01-09 41 views
15

Xin chào tôi cần kế thừa các lược đồ của tôi trong thư viện mongoose. Có plugin hoàn chỉnh cho điều đó không? Hoặc làm thế nào tôi nên làm điều đó bản thân mình?Thừa kế ở mongoose

Tôi cần kế thừa tất cả tiền tố, bài đăng, phần mềm trung gian init từ một giản đồ Cơ sở.

Trả lời

15

Bạn có thể muốn xem xét sử dụng một Mongoose Plugin:

Một plugin mà những gì bạn muốn 'out of the box' là ở đây:

+1

Cảm ơn các ví dụ từ trang web chính thức. Nhưng tôi muốn thấy một giải pháp hoàn chỉnh. Tôi nghĩ rằng tôi không đơn độc trong vấn đề này. – Erik

+0

Kiểm tra liên kết thứ hai. – hunterloftis

+0

Cảm ơn bạn đã liên kết. Đó là điều tôi cần. – Erik

14

Đối với những người khác tìm kiếm chức năng này, Mongoose 3.8 hiện nay có Schema Thừa kế qua chức năng phân biệt:

https://github.com/LearnBoost/mongoose/pull/1647

+1

Hiện tại, những kẻ phân biệt đối xử được xây dựng của Mongoose chỉ cho phép một "cấp độ" thừa kế duy nhất. Đã xảy ra sự cố để giải quyết vấn đề này tại đây: https://github.com/Automattic/mongoose/issues/2851. – c1moore

0

Kiểm tra các mô hình của khuôn khổ này cho Mongoose:

https://github.com/marian2js/rode#models-with-mongoose

Đây là một ví dụ về người mở rộng các hình tam giác với khung này:

Trước hết, hãy xác định lược đồ của bạn bên trong "mô hình rode" mới:

var rode = require('rode'); 

var User = rode.Model.extend({ 
    name: 'User', 
    schema: { 
    name: { 
     type: 'String', 
     unique: true 
    }, 
    email: String, 
    password: String 
    } 
}); 

Bây giờ bạn nên gọi mở rộng phương pháp:

var Admin = User.extend({ 
    name: 'Admin', 
    // The schema for admins is the schema for users + their own schema 
    schema: { 
    lastAccess: Date 
    } 
}); 

Nhưng có trong bạc hà ghi chú này được chiết xuất từ ​​github khuôn khổ: "Cả hai mô hình sẽ chia sẻ bộ sưu tập cùng trên MongoDB. Tài liệu của các mô hình mở rộng sẽ có một thuộc tính _type để phân biệt. "

2

Tôi biết đây là một oldie, nhưng tôi đến đây tìm câu trả lời cho cùng một câu hỏi và kết thúc làm một cái gì đó hơi khác một chút. muốn sử dụng discriminators bởi vì tất cả các tài liệu được lưu trữ trong bộ sưu tập tương tự.

ModelBase.js

var db = require('mongoose'); 

module.exports = function(paths) { 
    var schema = new db.Schema({ 
     field1: { type: String, required: false, index: false }, 
     field2: { type: String, required: false, index: false } 
    }, { 
     timestamps: { 
      createdAt: 'CreatedOn', 
      updatedAt: 'ModifiedOn' 
     } 
    }); 

    schema.add(paths); 

    return schema; 
}; 

NewModel.js

var db = require('mongoose'); 
var base = require('./ModelBase'); 
var schema = new base({ 
    field3: { type: String, required: false, index: false }, 
    field4: { type: String, required: false, index: false } 
}); 

db.model('NewModelItem', schema, 'NewModelItems'); 

Tất cả 4 trường sẽ nằm trong NewModelItem. Sử dụng ModelBase cho các mô hình khác mà bạn muốn sử dụng cùng trường/tùy chọn/v.v. Trong dự án của tôi, tôi đặt dấu thời gian vào đó.

Schema.add được gọi trong hàm tạo lược đồ, do đó mô hình sẽ được tập hợp như thể tất cả các trường được gửi trong lệnh gọi hàm dựng ban đầu.

+0

tôi đã thử cách này nhưng gặp lỗi – Sajeetharan

1

Nếu bạn muốn sử dụng bộ sưu tập khác nhau:

function extendSchema (Schema, definition, options) { 
    return new mongoose.Schema(
    Object.assign({}, Schema.obj, definition), 
    options 
); 
} 

Cách sử dụng:

const UserSchema = new mongoose.Schema({ 
    firstname: {type: String}, 
    lastname: {type: String} 
}); 

const ClientSchema = extendSchema(UserSchema, { 
    phone: {type: String, required: true} 
}); 

https://www.npmjs.com/package/mongoose-extend-schema