javascript - 如何在检索模型中的完整列表时调用猫鼬模式中定义的方法?
问题描述
我在猫鼬模型上定义了一个方法如下 -
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();
解决方案
如果您真的想要一种有效的方法,您可以在聚合查询中执行此操作,或者您可以将年龄存储在某个缓存中并从那里读取年龄,但通常您可以使用 mongoose virtuals 并在虚拟字段中计算年龄。
编辑:
不需要从 mongoose 获取年龄,因为它是一个虚拟字段,在 db 上不存在,而且您需要在 select 中获取 dateOfBirth 以便 mongoose 能够计算虚拟字段中的年龄。
尝试这个
const patientList = await Patient.find({})
.sort({name:1})
.limit(limit)
.skip(skipIndex)
.select(['name', 'gender', 'dateOfBirth'])
.exec();