2016-08-16 2 views
0

Я создаю CMS для сайта. Существует страница, которая должна иметь контент из CMS. Для страницы about должен быть только один документ, действующий как файл конфигурации. Мое предлагаемое решение для этого:Mongoose - Singleton Модель

  1. Создайте модель страницы.
  2. В сохранении я проверю, есть ли существующий документ.
  3. Если есть существующий документ, обновите этот документ. Если не сохранить новый.

Есть ли лучший способ сделать это? Есть ли способ сделать это в предварительном крюке save для моей схемы?

ответ

1

Попробуйте findAndModify mongodb, если у вас есть тот же _id документ будет обновлен, иначе будет создан новый документ.

же включена в мангуст под findOneAndUpdate

1

Вы можете сделать это тремя способами:

  1. Сначала называют findOne затем в обратный вызов, который вы проверяете, если строка существует, а затем, если не существует (документ == = нуль) называют save,
  2. Используйте findOneAndUpdate метод от Мангуста с опцией upsert к истине,
  3. ли это, как вы описали, используя prehook.

В этом случае я предпочту использовать первый или второй вариант. Крюки имеют некоторую магию, что означает, что для человека, который смотрит на код в первый раз, будет немного сложнее найти, что происходит: P Но крючок может быть лучшим решением, если тот же сценарий (что document save action) выполняется во многих местах. Это спорный вопрос - я просто положил свои два цента ...

2

Нечто подобное можно было бы сделать для одноплодной модели:

HomePageSchema.statics = { 
 getSingleton: function (cb) { 
       this.findOne() 
           .sort({updated: -1}) 
           .limit(1) 
           .exec(function (error, model) { 
               if (error) { 
                   cb(error, null); 
               } else if (model == null) { 
                   cb(error, new HomePage()); 
               } else { 
                   cb(error, model); 
               } 
           }); 
   }, 
}; 

, а затем

HomePage.getSingleton((err, homepage) => { 
 homepage.image = '/images/myImage.jpg'; 
   homepage.headline = 'Homepage Headline'; 
   homepage.save(); 
}); 
+0

Спасибо за это решение , Однако есть ошибка, getSingleton принимает 2 параметра, ошибку и модель, так как это то, что вы отправляете в cb(). В противном случае я получал нулевое значение. Пожалуйста, отредактируйте код, чтобы сказать HomePage.getSingleton (function (err, homepage) {... – Totomobile

+0

Кроме того, чтобы этот код работал как экспорт, вы должны иметь следующую последовательность: HomePageSchema.statics = {.... , Затем var HomePage = mongoose.model ('Config', HomePageSchema) ;, затем module.exports = HomePage. – Totomobile

+0

Я хотел бы выразить благодарность и сказать, что это решение (с добавлением @Totomobile) работало абсолютно Я бы не понял этого без этой должности. –

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