2012-04-10 3 views
35

Я только что начал с мангуста. У меня есть сценарий создания с mongoose, который создает схемы и db с образцами данных.создание схемы мангуста

Теперь я пишу фактическое приложение. Нужно ли создавать объект схемы каждый раз, когда запускается мое приложение, или оно уже доступно?

Других слов мне нужно, чтобы запустить этот код в каждом приложении, которое использует мангуст, чтобы получить доступ к БД или просто в первый раз:

var Comments = new Schema({ 
    title  : String 
    , body  : String 
    , date  : Date 
}); 

Как изменится ответ, если у меня есть сеттера/валидация/и т.д. ?

ответ

71

Определяет Schema, поэтому приложение понимает, как отображать данные из MongoDB в объекты JavaScript. Schema является частью приложения. У этого есть ничего, чтобы сделать с базой данных. Он только отображает базу данных в объекты JavaScript. Так что да - если вы хотите иметь хорошее сопоставление, вам нужно запустить этот код в каждый приложение, которое в нем нуждается. Это также относится к геттерам/сеттерам/валидации/и т. Д.

Однако обратите внимание, что делает это:

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; // <-- EDIT: missing in the original post 
var Comments = new Schema({ 
    title  : String 
    , body  : String 
    , date  : Date 
}); 
mongoose.model("Comments", Comments); 

зарегистрирует Schema globaly. Это означает, что если приложение вы работаете используете некоторый внешний модуль, то в этом модуле вы можете просто использовать

var mongoose = require('mongoose'); 
var Comments = mongoose.model("Comments"); 
Comments.find(function(err, comments) { 
    // some code here 
}); 

(обратите внимание, что на самом деле нужно зарегистрировать Schema перед использованием этого кода, в противном случае исключение будет выброшен).

Однако все это работает только внутри одного узла, поэтому, если вы используете другое приложение узла, которому необходим доступ к Schema, вам необходимо вызвать регистрационный код. Так что это хорошая идея, чтобы определить все Schemas в отдельных файлах, например comments.js может выглядеть следующим образом

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; // <-- EDIT: missing in the original post 

module.exports = function() { 
    var Comments = new Schema({ 
     title  : String 
     , body  : String 
     , date  : Date 
    }); 
    mongoose.model("Comments", Comments); 
}; 

затем создать файл models.js, который может выглядеть как этот

var models = ['comments.js', 'someothermodel.js', ...]; 

exports.initialize = function() { 
    var l = models.length; 
    for (var i = 0; i < l; i++) { 
     require(models[i])(); 
    } 
}; 

Теперь вызова require('models.js').initialize(); будет инициализировать все ваших схем для заданного сеанса узла.

+0

Да, это круто. Используя этот метод, есть ли у вас какие-либо идеи относительно того, как обращаться с зависимостями (встроенными документами)? –

+1

@AdrienSchuler Нет проблем с зависимостями. Вы определяете документы Embededd как обычно, в одном из файлов. Просто убедитесь, что если файл 'second.js' относится к модели в файле' first.js', то 'first.js' переходит перед' second.js' в переменную 'model'. – freakish

+0

Звучит здорово, я попробую это, спасибо! –

4

Вам нужно запустить этот код инициализации при каждом запуске приложения, чтобы зарегистрировать схемы вашего приложения с помощью мангуста.

Когда ваше приложение заканчивается, мангуста не хранит ваши Схемы. Итак, в следующий раз, когда вы запустите приложение, использующее схему, вам нужно снова зарегистрировать свои схемы.

Однако для этого достаточно настроить приложение.

Вот две ссылки на код, который демонстрирует, как можно инициализировать схемы в мангусте. Первый - в JavaScript, второй - в CoffeeScript.

https://github.com/fbeshears/register_models

https://github.com/fbeshears/register_coffee_models

Демонстрационные JavaScript только одно приложение.

Код CoffeeScript имеет два отдельных приложения. Первый хранит документы с MongoDB, второй находит и отображает документы, хранящиеся в первом приложении.