2014-10-02 23 views
0

我有以下模式結構:貓鼬 - 二傳手不呼籲子(-sub)文件

var ProgramSchema = new Schema({ 
... 
networks: [NetworksSchema] 
}); 

    var NetworksSchema = new Schema({ 
    payments: [NetworkPaymentsSchema], 
    ... 
    }); 

    var NetworkPaymentsSchema = new Schema({ 
     ... 
     amount: { type: Number, get: genFunc.getCurrency, set: genFunc.setCurrency, required: true } 
    }); 

每當我創建()或save()一ProgramSchema,在NetworkPaymentsSchema getter和setter不叫。

到目前爲止,我試着撥打二傳手是這樣的:

NetworkPaymentsSchema.path('amount').set(genFunc.setCurrency); 

似乎並沒有擦出火花。

感謝您的幫助!

回答

0

我已經使用過以下之前爲我工作。我假設你用美分而不是浮動價格來儲存價格。你不應該打電話給二傳手,貓鼬應該爲你做。只需保存數據。

Schema: { 
    amount: {type: Number, get: getPrice, set: setPrice } 
} 

function getPrice(num){ 
    return Number((num/100).toFixed(2)); 
} 

function setPrice(num){ 
    return Number(num)*100; 
} 
0

請注意,變量定義順序在JavaScript中很重要。在運行你的代碼片段ProgramSchema看起來就像這樣:

var ProgramSchema = new Schema({ 
    ... 
    networks: [undefined] // Which is effectively equivalent to mongoose.SchemaTypes.Mixed or {} 
}); 

這是因爲在ProgramSchema既不NetworkSchema也不NetworkPaymentSchema定義的時刻被定義。雖然它們都被聲明爲hoisting,它可以防止程序與ReferenceError崩潰。因此,你的模式之間沒有任何關係。

所以要解決您的問題,您必須將子模式的定義移動到ProgramSchema的子模式的定義之上。即你的代碼必須如下所示(請注意架構定義的順序):

var NetworkPaymentsSchema = new Schema({ 
    ... 
    amount: { type: Number, get: genFunc.getCurrency, set: genFunc.setCurrency, required: true } 
}); 

var NetworksSchema = new Schema({ 
    payments: [NetworkPaymentsSchema], 
    ... 
}); 

var ProgramSchema = new Schema({ 
    ... 
    networks: [NetworksSchema] 
}); 

我對MongoDB的2.6.4和貓鼬3.8.17測試,它似乎工作。