2013-01-09 16 views
15

Witam Muszę dziedziczyć moje schematy w bibliotece mangusty. Czy są na to pełne wtyczki? Albo jak mam to zrobić?Dziedziczenie w mangurze

Muszę odziedziczyć również oprogramowanie pośrednie pre, post, init ze schematu podstawowego.

Odpowiedz

15

Możesz zajrzeć do korzystania z Mongoose Plugin:

Wtyczka, że ​​robi to, co chcesz 'out of the box' jest tutaj:

+1

Dzięki za przykład z oficjalnej strony. Ale chcę zobaczyć kompletne rozwiązanie. Myślę, że nie jestem sam w tym problemie. – Erik

+0

Sprawdź drugi link. – hunterloftis

+0

Dzięki za link. To jest to, czego potrzebuję. – Erik

14

Dla innych szukających tej funkcjonalności, Mongoose 3.8 ma teraz schematu dziedziczenia poprzez funkcje dyskryminacyjne:

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

+1

W tej chwili wbudowane dyskryminatory Mongoose zezwalają tylko na jeden "poziom" dziedziczenia. Jest problem, aby rozwiązać ten problem tutaj: https://github.com/Automattic/mongoose/issues/2851. – c1moore

0

sprawdzić modeli ram Mongoose:

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

ten jest przykładem kogo rozszerzać shemas z tą strukturą:

Przede wszystkim określ swój schemat w nowym "modelu rode":

var rode = require('rode'); 

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

Teraz należy zadzwonić przedłużyć metoda:

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

Ale mają w mięty tę notatkę wyodrębnione z github ramowej: „Oba modele będą dzielić tę samą kolekcję na MongoDB. Dokumenty rozszerzonych modeli będą miały atrybut _type do rozróżnienia. "

2

Wiem, że to staruszek, ale przyjechałem tutaj, szukając odpowiedzi na to samo pytanie i skończyłem robiąc coś trochę innego. aby móc korzystać z dyskryminatory ponieważ wszystkie dokumenty są przechowywane w tej samej kolekcji.

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'); 

Wszystkie 4 pola będą w NewModelItem. Użyj ModelBase dla innych modeli, w których chcesz używać tych samych pól/opcji/etc. W moim projekcie umieściłem tam znaczniki czasu.

Schema.add jest wywoływana w konstruktorze schematu, więc model powinien zostać złożony tak, jakby wszystkie pola zostały wysłane w pierwotnym wywołaniu konstruktora.

+0

Próbowałem tego, ale otrzymałem błąd – Sajeetharan

1

Jeśli chcesz użyć różne zbiory:

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

Zastosowanie:

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