web-dev-qa-db-fra.com

création de schéma mangouste

Je viens de commencer avec la mangouste. J'ai un script de création avec mangouste qui crée les schémas et db avec des exemples de données.

Maintenant, j'écris l'application réelle. Dois-je créer l'objet de schéma à chaque exécution de mon application, ou est-il déjà disponible d'une manière ou d'une autre?

En d'autres termes, dois-je exécuter ce code dans chaque application qui utilise mangouste pour accéder à la base de données ou juste la première fois:

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

Comment la réponse changerait-elle si j'ai des setters/validations/etc?

43
Yaron Naveh

L'un définit Schema pour que l'application comprenne comment mapper des données de MongoDB dans des objets JavaScript. Schema fait partie de l'application. Il a rien à voir avec la base de données. Il mappe uniquement la base de données dans des objets JavaScript. Alors oui - si vous voulez avoir un mappage Nice, vous devez exécuter ce code dans chaque application qui en a besoin. Elle s'applique également aux getters/setters/validations/etc.

Notez cependant que cela:

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

enregistrera Schema globalement. Cela signifie que si l'application que vous exécutez utilise un module extérieur, vous pouvez simplement utiliser dans ce module

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

(notez que vous devez réellement enregistrer le Schema avant d'utiliser ce code, sinon une exception sera levée).

Cependant, tout cela ne fonctionne qu'à l'intérieur d'une session de nœud, donc si vous exécutez une autre application de nœud qui a besoin d'accéder au Schema, vous devez appeler le code d'enregistrement. C'est donc une bonne idée de définir tous les schémas dans des fichiers séparés, par exemple comments.js Peut ressembler à ceci

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

puis créez le fichier models.js qui peut ressembler à ceci

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

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

Maintenant, appeler require('models.js').initialize(); initialisera tous vos schémas pour une session de noeud donnée.

77
freakish

Vous devez exécuter ce code d'initialisation chaque fois que vous exécutez votre application pour enregistrer les schémas de votre application avec mangouste.

À la fin de votre application, mangouste ne stocke pas vos schémas. Ainsi, la prochaine fois que vous exécutez une application qui utilise un schéma, vous devez enregistrer à nouveau vos schémas.

Cependant, il est assez facile de configurer votre application pour ce faire.

Voici deux liens vers du code qui montre comment on peut initialiser des schémas en mangouste. Le premier est en JavaScript, le second est en CoffeeScript.

https://github.com/fbeshears/register_models

https://github.com/fbeshears/register_coffee_models

Les démos JavaScript ne sont qu'une application.

Le code CoffeeScript a deux applications distinctes. Le premier stocke des documents avec MongoDB, le second recherche et affiche les documents stockés par la première application.

4
fbeshears