2013-10-01 2 views
2

У меня есть четыре модели Mongoose, SoleTrader, Partnership, Company и Trust. Они достаточно разные, что я не могу объединить их всех в одну схему, но достаточно похожую на то, что мне регулярно нужно запрашивать или вносить изменения во все 4 типа одновременно и редко заботиться о том, какой тип они есть.Можно ли одновременно искать несколько моделей Mongoose?

Есть ли способ сделать это - возможно, поместив все четыре типа в одну коллекцию - без четырех вызовов базы данных каждый раз?

+0

Аналогичный вопрос [здесь] (http://stackoverflow.com/questions/14228882/inheritance-in-mongoose). Здесь упоминается [mongoose-schema-extend] (https://github.com/briankircho/mongoose-schema-extend). – robertklep

+0

Я уже использую mongoose-schema-extend для создания схем, но, насколько я могу судить, он не предлагает ничего, что могло бы помочь с этой проблемой. Дайте мне знать, если я что-то упустил. – cbnz

ответ

3

Поскольку вы используете mongoose-schema-extend, похоже, что вы можете создать простую «базовую» схему и расширить свою другую схему. Если вы хотите выполнить поиск по всем из них, используйте базовую модель.

Например:

// base schema 
var PersonSchema = new Schema({ 
    name : String 
}, { 
    collection  : 'users', // everything will get saved in the same collection 
    discriminatorKey : '_type' 
}); 

// two schema's that extend off it 
var EmployeeSchema = PersonSchema.extend({ department : String }); 
var EmployerSchema = PersonSchema.extend({}); 

// materialize all three into models 
var Person = mongoose.model('Person', PersonSchema); 
var Employee = mongoose.model('Employee', EmployeeSchema); 
var Employer = mongoose.model('Employer', EmployerSchema); 

... 

// create some people 
new Employee({ 
    name  : 'Homer Simpson', 
    department : 'Safety' 
}).save(...); 

new Employer({ 
    name : 'Charles Montgomery Burns', 
}).save(...); 

... 

// search across employers and employees 
Person.find({ ... }, function(err, people) { 
    ... 
}); 

Однако, я должен сказать, что advertised behaviour из find() возвращает правильный экземпляр модели в соответствии с ключом дискриминатора не работает для меня.

+0

Спасибо, что работает. Идея сохранения базовой схемы как модели никогда не приходила мне в голову; Я только сохранил его расширения. Однако у меня была проблема с ключом дискриминатора. Это не спасается вообще. – cbnz

+0

@cbnz ключ сохраняется в db в моем случае, но он не используется для «приведения» результатов к правильной модели. Я напишу отчет об ошибке. :) – robertklep

Смежные вопросы