Как получить данные другой модели в функции получения виртуального поля | мангуст

#node.js #mongodb #mongoose #mern

Вопрос:

Я работаю над проектом стека MERN, в котором пользователь может выполнять операции CRUD с целями. Я использую мангуста для моделирования объектов. Я хочу создать виртуальное поле с именем stepAvg, чтобы узнать некоторую информацию о каждой цели с помощью пошаговой модели.

Информация о взаимоотношениях

У каждого пользователя много целей.

Каждая цель состоит из множества шагов.

GoalModel.js

 const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const StepModel = require("./StepModel");

const GoalSchema = new Schema({
    category: { type: Schema.ObjectId, ref: "Category", required: true },
    title: { type: String, required: true },
    startDate: { type: Date, required: true },
    completionDate: { type: Date, required: true },
    commitment: { type: String, required: true },
    obstacle: { type: String, default: null },
    celebration: { type: String, default: null },
    user: { type: Schema.ObjectId, ref: "User", required: true },
    steps: [{ type: Schema.Types.ObjectId, ref: "Step"}],
}, {
    toJSON: { virtuals: true },
    toObject: { virtuals: true }
}, {timestamps: true});

GoalSchema.virtual('stepAvg').get(async function() {
    let steps = await StepModel.find({ goal: this.id }); 
    // if I console steps it return the data correctly.
    let totalSteps = steps.length;
    if (totalSteps) {
        let completedSteps = steps.filter(function(step) {
            return step.isCompleted;
        }).length;
        let avg = ( completedSteps / totalSteps) * 100;
        return avg;
    }
    return 0;
});

module.exports = mongoose.model("Goal", GoalSchema);
 

Как вы можете видеть, я создаю виртуальное поле stepAvg, но каждый раз оно выдает мне пустой объект. Это действительно возвращает обещание.

Скриншот почтальона Скриншот почтальона