Почему у Мангуста есть и схемы, и модели?



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

707   4  

4 ответов:

часто самый простой способ ответить на этот тип вопроса-это пример. В этом случае, кто-то уже сделал это за меня :)

посмотри здесь:

http://rawberg.com/blog/nodejs/mongoose-orm-nested-models/

EDIT: оригинальный пост (как уже упоминалось в комментариях), похоже, уже не существует, так что я воспроизвел ниже. Если он когда-нибудь вернется, или если он только что переехал, пожалуйста, позвольте мне знать.

он дает достойное описание использования схем в моделях в мангусте и почему вы хотите это сделать, а также показывает, как продвигать задачи через модель, в то время как схема-это все о структуре и т. д.

Исходный Пост:

начнем с простого примера встраивания схемы в модель.

var TaskSchema = new Schema({
    name: String,
    priority: Number
});

TaskSchema.virtual('nameandpriority')
    .get( function () {
        return this.name + '(' + this.priority + ')';
    });

TaskSchema.method('isHighPriority', function() {
    if(this.priority === 1) {
        return true;
    } else {
        return false;
    }
}); 

var ListSchema = new Schema({
    name: String,
    tasks: [TaskSchema]
});

mongoose.model('List', ListSchema);

var List = mongoose.model('List');

var sampleList = new List({name:'Sample List'});

я создал новый TaskSchema объект с основной информацией, которую может иметь задача. Мангуст виртуальный атрибут настройка для удобного объединения имени и приоритета задачи. Я только указал геттер здесь, но виртуальные сеттеры также поддерживаются.

я также определил простой метод задачи под названием isHighPriority чтобы продемонстрировать, как методы работы с этой установкой.

на ListSchema определение вы заметите, как ключ задачи настроен для хранения массива TaskSchema объекты. Ключ задачи станет экземпляром DocumentArray который обеспечивает специальные методы работы со встроенными документами Mongo.

пока я только сдал ListSchema объект в мангуста.модель и оставил задачи без внимания. Технически это не обязательно, чтобы превратить TaskSchema в формальную модель, так как мы не будем сохранять его в своей собственной коллекции. Позже я покажу вам, как это ничего не повредит, если вы это сделаете, и это может помочь организовать все ваши модели таким же образом, особенно когда они начинают охватывать несколько файлов.

С List настройка модели давайте добавим к ней пару задач и сохраним их в Mongo.

var List = mongoose.model('List');
var sampleList = new List({name:'Sample List'});

sampleList.tasks.push(
    {name:'task one', priority:1}, 
    {name:'task two', priority:5}
);

sampleList.save(function(err) {
    if (err) {
        console.log('error adding new list');
        console.log(err);
    } else {
        console.log('new list successfully saved'); 
    }
});

атрибут задачи на экземпляре нашего List модель (simpleList) работает как обычный массив JavaScript, и мы можем добавлять в него новые задачи с помощью push. Важно отметить, что задачи добавляются как обычные объекты JavaScript. Это тонкое различие, которое может быть не сразу понятный.

вы можете проверить из оболочки Mongo, что новый список и задачи были спасен для монго.

db.lists.find()
{ "tasks" : [
    {
        "_id" : ObjectId("4dd1cbeed77909f507000002"),
        "priority" : 1,
        "name" : "task one"
    },
    {
        "_id" : ObjectId("4dd1cbeed77909f507000003"),
        "priority" : 5,
        "name" : "task two"
    }
], "_id" : ObjectId("4dd1cbeed77909f507000001"), "name" : "Sample List" }

теперь мы можем использовать ObjectId одернуть Sample List и повторите его задачи.

List.findById('4dd1cbeed77909f507000001', function(err, list) {
    console.log(list.name + ' retrieved');
    list.tasks.forEach(function(task, index, array) {
        console.log(task.name);
        console.log(task.nameandpriority);
        console.log(task.isHighPriority());
    });
});

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

List.findById('4dd1cbeed77909f507000001', function(err, list) {
    console.log(list.name + ' retrieved');
    list.tasks.forEach(function(task, index, array) {
        console.log(task.name);
        console.log(task.nameandpriority);
        console.log(task._schema.methods.isHighPriority.apply(task));
    });
});

если вы запустите этот код, вы должны увидеть следующий вывод в командной строке.

Sample List retrieved
task one
task one (1)
true
task two
task two (5)
false

С этой работой вокруг в виду давайте повернем TaskSchema в модель Мангуста.

mongoose.model('Task', TaskSchema);

var Task = mongoose.model('Task');

var ListSchema = new Schema({
    name: String,
    tasks: [Task.schema]
});

mongoose.model('List', ListSchema);

var List = mongoose.model('List');

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

давайте создадим новый список и добавьте две Экземпляры модели задачи в нем.

var demoList = new List({name:'Demo List'});

var taskThree = new Task({name:'task three', priority:10});
var taskFour = new Task({name:'task four', priority:11});

demoList.tasks.push(taskThree.toObject(), taskFour.toObject());

demoList.save(function(err) {
    if (err) {
        console.log('error adding new list');
        console.log(err);
    } else {
        console.log('new list successfully saved'); 
    }
});

когда мы внедряем экземпляры модели задачи в список, который мы вызываем toObject на них, чтобы преобразовать свои данные в простые объекты JavaScript, которые List.tasksDocumentArray ждет. Когда вы сохраняете экземпляры модели таким образом, ваши встроенные документы будут содержать ObjectIds.

полный пример кода доступно как gist. Надеюсь, эти обходные пути помогут сгладить ситуацию, поскольку Мангуст продолжает развивать. Я все еще довольно новичок в Мангусте и MongoDB, поэтому, пожалуйста, не стесняйтесь делиться лучшими решениями и советами в комментариях. Счастливого моделирования данных!

- схемы - это объект, который определяет структуру любых документов, которые будут храниться в вашей коллекции MongoDB; он позволяет определить виды и валидаторы для всех элементов данных.

модель - это объект, который дает вам легкий доступ к именованной коллекции, позволяя вам запрашивать коллекцию и использовать схему для проверки любых документов, сохраненных в этой коллекции. Он создается путем объединения схемы, соединения и коллекции имя.

оригинальная фраза Валерия Карпова,Блог MongoDB

Я не думаю, что принятый ответ на самом деле отвечает на поставленный вопрос. Ответ не объясняет почему Мангуст решил потребовать от разработчика предоставить как схему, так и переменную модели. Пример фреймворка, где они устранили необходимость в разработчик для определения схемы данных является django--разработчик записывает свои модели в models.py файл, и оставляет его в рамках для управления схемой. Первая причина в том, что приходит на ум, почему они это делают, учитывая мой опыт работы с django, это простота в использовании. Возможно, более важным является сухой (не повторяйтесь) принцип-вам не нужно помнить, чтобы обновить схему при изменении модели-django сделает это за вас! Rails также управляет схемой данных для вас-разработчик не редактирует схему напрямую, а изменяет ее, определяя миграции, которые управляют схемой.

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

возможно, исходный вопрос является скорее реликтом традиционной системы реляционных баз данных. В мире NoSQL/Mongo world, возможно, схема немного более гибкая, чем MySQL/PostgreSQL, и поэтому изменение схемы более распространено практиковать.

простыми словами,

A модель это объектная модель данных, как вы найдете в дизайне MVC pattern.It определяет структура какие данные должны храниться в базе данных и какое отношение имеют данные.

A - схемы как database schema, определение того, что будет храниться в базе данных.

Comments

    Ничего не найдено.