簡體   English   中英

如何在 model 中檢索完整列表時調用 mongoose 模式中定義的方法?

[英]How to call method defined in a mongoose schema while retriving complete list in a model?

我在 mongoose model 上定義了一個方法如下 -

PatientSchema.methods.getAge = function(){
    let ageDifMs = (Date.now() - this.dateOfBirth.getTime());
    let ageDate = new Date(ageDifMs);
    let age = Math.abs(ageDate.getUTCFullYear() - 1970);
    return age;
}

當我檢索該相關 model 的單個實例時,它工作正常。 現在我檢索多個實例時的問題如下 -

const patientList = await Patient.find({})

如何在 JS object 中添加新的鍵值對,其中值是使用 model 中定義的方法生成的。 我可以使用循環來做到這一點,但我想知道是否有任何優化的方式?

更新 - 正如@Milad Raeisi 所述,我使用虛擬機如下 -

PatientSchema.virtual('age').get(function () {
    let temp = new Date(this.dateOfBirth)
    let ageDifMs = (Date.now() - temp.getTime());
    let ageDate = new Date(ageDifMs);
    return Math.abs(ageDate.getUTCFullYear() - 1970);
})

同時設置mongoose.set('toJSON', { virtuals: true });

同樣,它對於單個實例非常有效,但對於多個實例返回 null。

我正在使用以下代碼來獲取患者名單 -

const patientList = await Patient.find({})
            .sort({name:1})
            .limit(limit)
            .skip(skipIndex)
            .select(['name', 'gender', 'age'])
            .exec();

如果您真的想要一種有效的方法,您可以在聚合查詢中執行此操作,或者您可以將年齡存儲在某個緩存中並從那里讀取年齡,但通常您可以使用 mongoose 虛擬並在虛擬字段中計算年齡。

檢查這個鏈接

編輯:

不需要從 mongoose 中獲取年齡,因為它是一個虛擬字段,在 db 上不存在,而且您需要在 select 中獲取 dateOfBirth 才能計算 Z758D31F351CE11BF27C522F516CB4 中的年齡。

嘗試這個

const patientList = await Patient.find({})
        .sort({name:1})
        .limit(limit)
        .skip(skipIndex)
        .select(['name', 'gender', 'dateOfBirth'])
        .exec();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM