mongoose - set子没有调用sub(-sub)文件

时间:2014-10-02 17:41:51

标签: node.js mongodb mongoose

我有以下架构结构:

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

似乎也无效。

感谢您的帮助!

2 个答案:

答案 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;
}