2011-12-14 13 views
6

Realizzo un'app Web che consente agli utenti di creare le proprie raccolte MongoDB personalizzate sul mio server "registrando" lo schema in un client forma di latoDefinizione di uno schema Mongoose al volo da una 'descrizione' in formato JSON

Così l'utente creerà un lato client schema - dice con un modulo come questo: http://r.github.com/annotationsformatter/

Così il lato client Js genererà un oggetto JSON della forma, ad esempio:

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

Successivamente, la pagina invierà questo oggetto al server, che dovrebbe convertire le cose in data in uno schema Mongoose appropriato e creare una raccolta da esso, del nome della raccolta person.

Mi sono perso - come potrei fare? Sto parlando della parte da conversione a schema.

+0

Bene, è possibile controllare i documenti da http://mongoosejs.com/. La definizione di un modello è sulla prima pagina. Tutto ciò di cui hai bisogno oltre a quello e non sai forse ..? Dove vuoi usare questi moduli .. ecc.? – alessioalex

+0

La definizione di un modello è banale, quello che devo sapere è come convertirò questo oggetto formattato JSON (che un mucchio di stringhe) in uno schema reale, che dovrebbe comportare qualcosa come la conversione automatica di "nome": "String" 'to' name: String' –

risposta

11

Se ho compreso correttamente l'obiettivo, è necessario eseguire il loop su ciascuna di quelle definizioni di campo nel campo data nell'oggetto JSON e convertirlo in un campo valido per uno schema di mangusta mappandolo a un tipo effettivo. Così si potrebbe iniziare con somethign in questo modo:

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

Al fine di affrontare gli oggetti incorporati e tipi di array, probabilmente si vuole modificare questo per renderlo ricorsivo, e si scende più in profondità quando incontra un oggetto di quei tipi , poiché i campi potrebbero essere annidati insieme con profondità/struttura arbitrarie.

Spero che questo aiuti.

+0

Quasi esattamente ciò di cui avevo bisogno. Sono un po 'nuovo con Js, quindi grazie! Questo chiarisce molto. –

12

Ho scritto una libreria node.js esattamente per questo scopo: generare modelli di mangusta da file di configurazione .json.

Si chiama mongoose-gen. Supporta tutti i tipi di mangusta, ha ganci per validatori, setter, getter e valori predefiniti.

Spero che aiuti.

0

Non so se si consiglia di farlo in questo modo, ma ho solo bisogno del mio file JSON e quindi rimuovo solo la proprietà "nome" creata durante il fabbisogno.

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

var MySchema = new Schema(jsonSchema); 
Problemi correlati