2012-04-10 9 views
35

Acabo de comenzar con mangosta. Tengo un script de creación con mangosta que crea los esquemas y db con datos de muestra.creación de esquema mangosta

Ahora escribo la aplicación real. ¿Necesito crear el objeto de esquema cada vez que se ejecuta mi aplicación, o ya está disponible de alguna manera?

En otras palabras necesito para ejecutar este código en cada aplicación que utiliza mangosta para acceder a la base de datos o sólo la primera vez:

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

¿Cómo cambiaría la respuesta si tengo set/validaciones/etc ?

Respuesta

71

Se define Schema para que la aplicación comprenda cómo asignar datos de MongoDB a objetos de JavaScript. Schema es una parte de la aplicación. Tiene nada que ver con la base de datos. Solo asigna la base de datos en objetos de JavaScript. Entonces, sí, si desea tener un buen mapeo, debe ejecutar este código en cada aplicación que lo necesite. También se aplica a getters/setters/validations/etc.

Nota sin embargo que al hacer esto:

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

registrará Schema globaly. Esto significa que si la aplicación se está ejecutando está utilizando algún módulo exterior, entonces en este módulo puede simplemente usar

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

(tenga en cuenta que en realidad se necesita registrar el Schema antes de utilizar este código, de otro modo una excepción será arrojado).

Sin embargo, todo esto funciona solo dentro de una sesión de nodo, por lo que si está ejecutando otra aplicación de nodo que necesita el acceso al Schema, debe llamar al código de registro. Por lo tanto, es una buena idea para definir todos los esquemas en archivos separados, por ejemplo comments.js puede tener este aspecto

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

continuación, crear el archivo models.js que puede tener este aspecto

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

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

Ahora llamando require('models.js').initialize(); inicializará todos de sus esquemas para una sesión de nodo determinada.

+0

Sí, esto es genial. Al usar este método, ¿tiene alguna idea sobre cómo manejar las dependencias (documentos incrustados)? –

+1

@AdrienSchuler No hay problema con las dependencias. Usted define los documentos Embededd como de costumbre, en uno de los archivos. Solo asegúrate de que si el archivo 'second.js' se refiere al modelo en el archivo' first.js', entonces 'first.js' va antes que' second.js' en la variable 'model'. – freakish

+0

Esto suena genial, voy a intentarlo, ¡gracias! –

4

Necesita ejecutar este código de inicialización cada vez que ejecuta su aplicación para registrar los esquemas de su aplicación con mangosta.

Cuando su aplicación finaliza, mongoose no almacena sus esquemas. Por lo tanto, la próxima vez que ejecute una aplicación que utiliza un esquema, debe registrar sus esquemas nuevamente.

Sin embargo, es bastante fácil configurar su aplicación para hacerlo.

Aquí hay dos enlaces al código que muestra cómo se pueden inicializar los esquemas en mangosta. El primero está en JavaScript, el segundo está en CoffeeScript.

https://github.com/fbeshears/register_models

https://github.com/fbeshears/register_coffee_models

Las demostraciones de JavaScript es una sola aplicación.

El código CoffeeScript tiene dos aplicaciones separadas. El primero almacena documentos con MongoDB, el segundo encuentra y muestra los documentos almacenados por la primera aplicación.

Cuestiones relacionadas