2013-04-07 67 views
0

我想直接用貓鼬保存模式在DB。下面是代碼(schema.js)在MongoDB中保存:保存模式使用貓鼬

var mongoose = require('mongoose'); 
var Mixed = mongoose.Schema.Types.Mixed; 
var modelSchema = mongoose.Schema({ 
schemaname:String, 
object : Mixed 
}) 

var Model = mongoose.model('Model',modelSchema); 

exports.createModel = function(model){ 
var model_to_create = new Model(model); 
console.log("creating a schema..." + model) 
model_to_create.save(function(err,data){ 
    console.log("Saving a schema...") 
    if(err){ 
     return "model creation failed"; 
    }else { 
     return "model creation success"; 
    } 
}); 

}

我使用下面的代碼創建模式:

var schema = require('../schemas/schema');  
var status = schema.createModel({ 
    "username": String, 
    "firstname": String, 
    "lastname": String, 
    "description": String, 
    "education": String 
}) 

出於某種原因,架構不會保存在數據庫中。 當我打印「狀態」,我得到「未定義」

誰能幫我,我怎麼能解決這個問題呢?

回答

3

保存模型是一個異步操作,你要等到它的回調被調用,然後才能讀取結果。要做到這一點的常用方法是通過一個將被調用時保存完成功能:

exports.createModel = function(model, callback) { 
    var model_to_create = new Model(model); 
    console.log("creating a schema..." + model) 
    model_to_create.save(function(err,data){ 
    callback(err, data); // <-- called when save is ready 
    }); 
}; 
... 
var schema = require('../schemas/schema');  
schema.createModel({ 
    "username": String, 
    "firstname": String, 
    "lastname": String, 
    "description": String, 
    "education": String 
}, function(err, data) { // <-- this is the callback you pass 
    // here you handle the results of saving the model 
}); 

編輯:同樣,你的模型只有兩個屬性(schemanameobject),但你」重新傳遞5個屬性給它的構造函數。如果你的目的是爲了節省每一個,你需要單獨保存:

schema.createModel({ 
    schemaname : 'username', 
    object  : 'String' // (you probably need to stringify your type, you can't save a class to MongoDB) 
}, function(err, data) { ... }); 

如果你想/需要等待所有的條目被保存在繼續之前,你可以使用async作爲協調多個的一種方式異步操作。

+0

非常感謝。但問題是直接在MongoDB中保存**數據類型**,如字符串,數字等。我不確定是否有任何解決此問題的方法。 – codejammer 2013-04-07 13:32:03

+0

謝謝@robertklep。對於我正在嘗試構建的這種應用,貓鼬只會造成傷害而不是利益。模式限制已成爲一個主要問題,我決定放下貓鼬,並使用mongojs,這是一個輕量級的本地驅動程序之上的輕量級皮膚,並且釋放NOSQL的靈活性 – codejammer 2013-04-08 08:53:56

0

添加到上一個答案, 保存貓鼬數據類型,有一個簡單的方法: 將它們保存爲字符串。當從數據庫中檢索模式數據時,只需使用mongoose.Schema.Types["String"]即可獲取字符串的數據類型。

我有一個類似的使用情況,並且我創建了一個簡單的遞歸函數來變換架構對象保存在數據庫模式數據:

function changeSchemaType(fields) { 
    var f; 
    for(key of Object.keys(fields)) { 
     f = fields[key]; 
     if(f.type && typeof f.type === 'string') { 
      f.type = mongoose.Schema.Types[f.type] 
     } else if(Array.isArray(f.type)){ 
      f.type = [mongoose.Schema.Types[f.type[0]]]; 
     } else { 
      changeSchemaType(f); 
     } 
    } 
} 

功能還允許簡單地通過創建類型的數組:["String"]爲類型。

舉例:

var data = { 
    data1 : {type : "Number", required : true}, 
    data2 : {type : ["String"]} 
} 
changeSchemaType(data); 
var mySchema = new Schema("mySchema", data) 

功能不處理速記syntaxe像field : "Mixed",但它可以適應如果需要的話。