#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, но каждый раз оно выдает мне пустой объект. Это действительно возвращает обещание.