2011-12-14 10 views
6

Estoy haciendo una aplicación web que permite a los usuarios crear sus propias colecciones MongoDB personalizadas en mi servidor al primero 'registrar' el esquema en un cliente forma lateral.Definir un esquema Mongoose sobre la marcha desde una 'descripción' con formato JSON

Así el usuario creará un lado del cliente esquema - por ejemplo utilizando un formulario como el siguiente: http://r.github.com/annotationsformatter/

Así el lado del cliente Js generará un objeto JSON de la forma, por ejemplo:

{ 
    "collection_name": "person", 
    "data": 
    { 
     "name": "String", 
     "email": "String", 
     "id", "Number", 
    } 
} 

A continuación, la página enviará este objeto al servidor, que debe convertir las cosas en data en un Esquema Mongoose adecuado y crear una colección a partir de él, del nombre de la colección person.

Estoy perdido, ¿cómo voy a hacer esto? Estoy hablando de la parte de la conversión al esquema.

+0

Bueno, puede consultar los documentos en http://mongoosejs.com/. La definición de un modelo está en la primera página. ¿Algo que necesites además de eso y no lo sé quizás ...? ¿Dónde quieres usar estos módulos, etc.? – alessioalex

+0

Definir un modelo es trivial, lo que necesito saber es cómo convertiré este objeto formateado en JSON (que es un montón de cadenas) en un esquema real, lo que debería implicar algo así como la conversión automática de '" nombre ":" Cadena " 'to' name: String' –

Respuesta

11

Si entiendo el objetivo correctamente, querrá un ciclo sobre cada una de esas definiciones de campo en el campo data en el objeto JSON y lo convertirá en un campo válido para un esquema de mangosta asignándolo a un tipo real. Por lo que podría comenzar con somethign así:

var mongoose = require('mongoose') 

var typeMappings = 
{"String":String, 
"Number":Number, 
"Boolean":Boolean, 
"ObjectId":mongoose.Schema.ObjectId, 
    //....etc 
} 

function makeSchema(jsonSchema){ 
    var outputSchemaDef = {} 
    for(fieldName in jsonSchema.data){ 
    var fieldType = jsonSchema.data[fieldName] 
    if(typeMappings[fieldType]){ 
     outputSchemaDef[fieldName] = typeMappings[fieldType] 
    }else{ 
     console.error("invalid type specified:", fieldType) 
    } 
    } 
    return new mongoose.Schema(outputSchemaDef) 
} 

Con el fin de hacer frente a los objetos incrustados y tipos de matriz, es probable que desee modificar este para que sea recursiva, y descender más profundo cuando se encuentra con un objeto de esos tipos , ya que los campos se pueden anidar juntos con profundidad/estructura arbitraria.

Espero que esto ayude.

+0

Casi exactamente lo que necesitaba. Soy un poco nuevo para Js, ¡así que gracias! Esto aclara mucho. –

12

He escrito una biblioteca node.js para exactamente este propósito: generar modelos de mangosta de .json archivos de configuración.

Se llama mongoose-gen. Es compatible con todos los tipos de mangostas, tiene ganchos para validadores, setters, getters y valores predeterminados.

Espero que ayude.

0

No sé si se recomienda hacerlo así, pero solo necesito mi archivo JSON y luego simplemente elimino la propiedad "name" create durante el requerimiento.

var jsonSchema = require('schema.json'); 
delete jsonSchema.name; 

var MySchema = new Schema(jsonSchema); 
Cuestiones relacionadas