WedX - журнал о программировании и компьютерных науках

Пользовательская функция конструктора в схеме/моделях Mongoose

Всем привет!

Я определил схему Mongoose, как показано ниже, и зарегистрировал модель (InventoryItemModel). Есть ли способ создать пользовательскую функцию-конструктор для схемы, чтобы при создании экземпляра объекта из модели вызывалась функция (например, для загрузки объекта со значением из базы данных)?

var mongoose = require('mongoose')
  , Schema = mongoose.Schema

var InventoryItemSchema = new Schema({
    Sku : String
  , Quanity : Number
  , Description : String
  , Carted : []
  , CreatedDate  : {type : Date, default : Date.now}
  , ModifiedDate  : {type : Date, default : Date.now}
});

mongoose.model('InventoryItem', InventoryItemSchema);

var item = new InventoryItem();

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

08.01.2013

  • Можете ли вы привести конкретный пример того, что вы пытаетесь сделать? 08.01.2013
  • Привет, я хотел создать управление запасами. Вышеупомянутый объект представляет элемент. Некоторые API будут помещать элемент в базу данных, и в моей программе я хочу, чтобы модель загружала один элемент из базы данных при создании экземпляра объекта. 08.01.2013
  • Взгляните на поддержку Mongoose для добавления методов статического конструктора в модели. 08.01.2013

Ответы:


1

В зависимости от того, в каком направлении вы хотите двигаться, вы можете:

1) Используйте хуки

Хуки автоматически запускаются, когда модели инициализируются, проверяются, сохраняются и удаляются. Это решение «наизнанку». Вы можете ознакомиться с документами здесь:

2) Напишите статическую функцию создания для вашей схемы.

Статика живет в вашем объекте модели и может использоваться для замены функций, таких как создание новой модели. Если у вас есть дополнительная логика для вашего шага create, вы можете написать ее самостоятельно в статической функции. Это решение «снаружи внутрь»:

09.01.2013
  • Как именно вы делаете # 2 (функция статического создания)? Кажется, в руководстве по Mongoose нет примеров, и простое добавление функции myschema.static.create ничего не дает. 26.03.2013
  • Эта ссылка (#statics) показывает вам, как писать статические данные. Просто напишите свою собственную статику (createNew или что-то в этом роде), которая проходит через любую логику, которую вы хотите, чтобы она прошла при создании. 26.03.2013
  • Извините, перепутал методы со статикой. 26.03.2013
  • я тоже сделал 2), но я думаю, что метод не должен называться create, так как он конфликтует с Модель.создать. Не уверен, что переопределение метода вредно, но, думаю, безопаснее использовать другое имя (например, make, initialize и т. д.). 14.09.2015

  • 2

    Вот реализация варианта № 2 из ответа пользователя @hunterloftis.

    2) Напишите статическую функцию создания для вашей схемы.

    someSchema.statics.addItem = function addItem(item, callback){
    //Do stuff (parse item)
     (new this(parsedItem)).save(callback);
    }
    

    Когда вы хотите создать новую модель из SomeSchema вместо

    var item = new ItemModel(itemObj);
    item.save(function (err, model) { /* etc */ });
    

    сделай это

    ItemModel.addItem(itemObj, function (err, model) { /* etc */ });
    
    22.08.2014

    3

    Я сам столкнулся с этой проблемой и написал плагин мангуста, который поможет решить вашу проблему.

    var mongoose = require('mongoose')
      , Schema = mongoose.Schema
      , construct = require('mongoose-construct')
    
    var user = new Schema({})
    user.plugin(construct)
    
    user.pre('construct', function(next){
        console.log('Constructor called...')
        next()
    })
    
    var User = mongoose.model('User', user)
    var myUser = new User(); // construct hook will be called
    

    Вот репозиторий (он также доступен на npm): https://github.com/IlskenLabs/mongoose-construct< /а>

    04.06.2013
  • Это крутая идея. Может ли он захватить аргумент, переданный конструктору схемы? Например, если я хочу вызвать var myUser = new User({foo:'bar'}) для настройки некоторого свойства пользователя при создании, есть ли способ получить доступ к этому «foo» из вашей функции предварительной сборки? 19.02.2015
  • @Victorb Честно говоря, я уже даже не помню, как это работает, и серьезно сомневаюсь, что это работает с последними версиями мангуста. Извиняюсь! 20.02.2015
  • @Victorb Просмотрел это, извините, не похоже, что это было бы возможно с любым крючком, не ломая ничего. Я бы сделал класс-оболочку, который принимает аргументы и инициализирует модель мангуста под капотом. 20.02.2015

  • 4

    @hunterloftis дал мне ответ, который мне был нужен. Теперь, почти 6 с лишним лет спустя, вот мое решение для всех остальных.

    InventoryItemSchema.static( 'new', function( that )
    {
        let instance = new InventoryItemSchema();
        Object.assign( instance, that );
        return instance;
    });
    

    или как однострочный (что менее удобно для отладки)

    InventoryItemSchema.static( 'new', function( that )
    {return Object.assign( new InventoryItemSchema(), that );});
    

    В любом случае, где вы хотели бы иметь

    let inventoryItem = new InventoryItemSchema({...});
    

    вместо этого у вас будет

    let inventoryItem = InventoryItemSchema.new({...});
    
    09.11.2019

    5

    Вам нужно экспортировать. Вот пример:

    import mongoose from "mongoose";
    
    let  Schema = mongoose.Schema;
    
    
    let restaurentSchema = new Schema({
      name : String
    })
    
    //export
    
    module.exports = mongoose.model("Restaurent", restaurentSchema)
    
    11.12.2016
    Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

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

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]