首页 > 解决方案 > 如何在检索模型中的完整列表时调用猫鼬模式中定义的方法?

问题描述

我在猫鼬模型上定义了一个方法如下 -

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

当我检索该相关模型的单个实例时,它工作正常。现在我检索多个实例时的问题如下 -

const patientList = await Patient.find({})

如何在使用模型中定义的方法生成值的 JS 对象中添加新的键值对。我可以使用循环来做到这一点,但我想知道是否有任何优化的方式?

更新 - 正如@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();

标签: javascriptmongodbmongodb-querymongoose-schema

解决方案


如果您真的想要一种有效的方法,您可以在聚合查询中执行此操作,或者您可以将年龄存储在某个缓存中并从那里读取年龄,但通常您可以使用 mongoose virtuals 并在虚拟字段中计算年龄。

检查这个链接

编辑:

不需要从 mongoose 获取年龄,因为它是一个虚拟字段,在 db 上不存在,而且您需要在 select 中获取 dateOfBirth 以便 mongoose 能够计算虚拟字段中的年龄。

尝试这个

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

推荐阅读