如何使用 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 从另一个虚拟中访问虚拟属性的主要内容,如果未能解决你的问题,请参考以下文章

从另一台电脑 xampp 访问虚拟主机

是否有可能在Mongoose查询结果中获取虚拟属性?

除了使用纯虚拟外,如何通过基类从派生类中获取成员

使用 Mongoose 进行虚拟填充

如何从另一个 js 文件/函数中触发 mongoose post hook?

Mongoose - 无法检索快速路线中的虚拟字段