如何使用 Mongoose 从另一个虚拟中访问虚拟属性
Posted
技术标签:
【中文标题】如何使用 Mongoose 从另一个虚拟中访问虚拟属性【英文标题】:How to access a virtual attribute from within another virtual using Mongoose 【发布时间】:2016-01-06 23:20:28 【问题描述】:我有一个发票模型,它使用虚拟属性来计算税收、小计、总计等的值。我遇到的问题是一些虚拟属性需要能够引用其他虚拟属性。
例如,这里是 Invoice 的 Mongoose 架构:
var InvoiceSchema = Schema(
number: String,
customer: ref:String, email:String,
invoiceDate: type: Date, default: Date.now,
dueDate: type: Date, default: Date.now,
memo: String,
message: String,
taxRate: type:Number, default:0,
discount:
value: type:Number, default:0,
percent: type:Number, default:0
,
items: [ItemSchema],
payment: type: Schema.Types.ObjectId, ref: 'Payment'
);
InvoiceSchema.virtual('tax').get(function()
var tax = 0;
for (var ndx=0; ndx<this.items.length; ndx++)
var item = this.items[ndx];
tax += (item.taxed)? item.amount * this.taxRate : 0;
return tax;
);
InvoiceSchema.virtual('subtotal').get(function()
var amount = 0;
for (var ndx=0; ndx<this.items.length; ndx++)
amount += this.items[ndx].amount;
return amount;
);
InvoiceSchema.virtual('total').get(function()
return this.amount + this.tax;
);
InvoiceSchema.set('toJSON', getters: true, virtuals: true );
var ItemSchema = Schema(
product: String,
description: String,
quantity: type: Number, default: 1,
rate: Number,
taxed: type: Boolean, default: false,
category: String
);
ItemSchema.virtual('amount').get(function()
return this.rate * this.quantity;
);
ItemSchema.set('toJSON', getters: true, virtuals: true );
module.exports = mongoose.model('Invoice', InvoiceSchema);
现在要了解这个问题,请看一下“税”的虚拟定义......
InvoiceSchema.virtual('tax').get(function()
var tax = 0;
for (var ndx=0; ndx<this.items.length; ndx++)
var item = this.items[ndx];
tax += (item.taxed)? item.amount * this.taxRate : 0;
return tax;
);
...在此示例中,item.amount,当在虚拟内部调用时,不会对 item.amount 使用虚拟 getter。
有没有办法告诉 Mongoose 我需要使用 getter 而不是尝试读取不存在的属性?
【问题讨论】:
【参考方案1】:你试过item.get('amount')
吗?
这似乎是使用虚拟的明确方式。
从这个问题中得到它: https://github.com/Automattic/mongoose/issues/2326 遗憾的是没有找到其他相关内容。
【讨论】:
以上是关于如何使用 Mongoose 从另一个虚拟中访问虚拟属性的主要内容,如果未能解决你的问题,请参考以下文章