我有以下架构结构:
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。
到目前为止,我试图以这种方式调用setter:
NetworkPaymentsSchema.path('amount').set(genFunc.setCurrency);
似乎也无效。
感谢您的帮助!
答案 0 :(得分:1)
请注意,变量定义顺序在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和Mongoose 3.8.17上进行了测试,它似乎有效。
答案 1 :(得分: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;
}