2011-12-14 45 views
6

我正在製作一個Web應用程序,它允許用戶在我的服務器上創建自己的自定義MongoDB集合,方法是首先在客戶端中「註冊」模式邊形式。從JSON格式的描述中即時定義Mongoose模式

那麼用戶將創建一個模式,客戶端 - 比如使用形式是這樣的:http://r.github.com/annotationsformatter/

所以客戶端JS會產生以下形式的JSON對象,例如:

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

接下來,頁面會將此對象發送給服務器,服務器應將data中的內容轉換爲適當的Mongoose Schema並從中創建集合名稱爲person的集合。

我迷路了 - 我該如何去做這件事?我正在談論轉換到模式部分。

+0

那麼你可以從http://mongoosejs.com/檢查文檔。定義一個模型在第一頁上。除此之外你還需要什麼,也許不知道..?你想在哪裏使用這些模塊..等等..? – alessioalex 2011-12-14 13:01:15

+0

定義一個模型是微不足道的,我需要知道的是我將如何將這個JSON格式的對象(一堆字符串)轉換爲一個真正的模式,這應該包括像自動轉換`「名稱」:「字符串」 `到`name:String` – 2011-12-14 13:09:57

回答

11

如果我正確理解目標,則需要循環遍歷JSON對象中data字段中的每個字段定義,並通過將其映射爲實際類型將其轉換爲適用於貓鼬模式的有效字段。所以,你可能有somethign像這樣開始:

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

爲了應對嵌入對象和數組類型,你可能會想修改該讓它遞歸,和下降較深時遇到這些類型的對象,因爲這些字段可以與任意深度/結構嵌套在一起。

希望這會有所幫助。

12

我已經爲此寫了一個node.js庫:從.json配置文件生成貓鼬模型。

它被稱爲mongoose-gen。它支持所有的貓鼬類型,它具有驗證器,設置器,獲取器和默認值的鉤子。

希望它有幫助。

0

我不知道是否建議像這樣做,但我只需要我的JSON文件,然後在require中刪除「name」屬性創建。

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

var MySchema = new Schema(jsonSchema);