2016-08-16 1 views
0

Je crée un CMS pour un site. Il y a une page à propos qui doit avoir du contenu du CMS. Il doit y avoir un seul document agissant comme un fichier de configuration pour la page about. Ma solution proposée pour cela est:Mongoose - Singleton Modèle

  1. Créer un modèle de page.
  2. Lors de la sauvegarde, je vérifierai s'il existe un document existant.
  3. S'il existe un document existant, mettez à jour ce document. S'il n'y en a pas, enregistrez-en un nouveau.

Existe-t-il une meilleure façon de procéder? Y at-il un moyen de le faire dans le save pré crochet pour mon schéma?

Répondre

1

Essayez findAndModify de mongodb tant que vous avez le même document _id sera mis à jour sinon un nouveau document sera créé.

même est incorporé dans mangouste sous findOneAndUpdate

1

Vous pouvez le faire de trois façons:

  1. appellent d'abord findOne puis dans le rappel que vous vérifiez si la ligne existe et si existe pas (document == = null) appelez save,
  2. Utilisez la méthode findOneAndUpdate de Mongoose avec option upsert true,
  3. Faites-en comme vous l'avez, en utilisant prehook.

Dans ce cas, je préférerai utiliser la première ou la deuxième option. Les hameçons ont un peu de magie, ce qui signifie que pour la personne qui regarde le code pour la première fois, il sera un peu plus difficile de trouver ce qui se passe: P Mais le crochet pourrait être une meilleure solution si le même scénario action de sauvegarde de document) est exécuté dans de nombreux endroits. Il est question discutable - Je viens de mettre mes deux cents ...

2

Quelque chose comme cela pourrait se faire pour un modèle singleton:

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); 
               } 
           }); 
   }, 
}; 

puis

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

Merci pour cette solution . Cependant, il y a une erreur, getSingleton prend 2 paramètres, error et model, puisque c'est ce que vous envoyez dans le cb(). Je recevais une valeur nulle sinon. S'il vous plaît modifier le code pour dire HomePage.getSingleton (fonction (err, page d'accueil) {... – Totomobile

+0

En outre, pour obtenir ce code pour fonctionner comme une exportation, vous devez avoir la séquence suivante: HomePageSchema.statics = {.... , Alors var HomePage = mongoose.model ('Config', HomePageSchema) ;, Puis module.exports = HomePage – Totomobile

+0

Je voudrais juste exprimer mes remerciements et dire que cette solution (avec l'addition de @Totomobile) a travaillé un absolu Je ne l'aurais pas compris sans ce post. –