У меня есть агрегатная функция, которая выдает результат массива верхнего уровня для моего 'one' в отношении db "один ко многим". Он суммирует отдельные годы для всех связанных «многих» документов.
Работает нормально, за исключением случаев, когда все экземпляры, принадлежащие этому конкретному «одному», удалены - хотя экземпляры действительно удалены, моя агрегатная функция по-прежнему работает так, как если бы последний экземпляр существовал.
Это моя функция:
outputSchema.statics.calcSumYears = async function (projectId) {
const stats = await this.aggregate([
{
$match: { project: projectId }
},
{
$group: {
_id: '$project',
year1: { $sum: { $arrayElemAt: ['$afterActivity', 0] } },
year2: { $sum: { $arrayElemAt: ['$afterActivity', 1] } },
year3: { $sum: { $arrayElemAt: ['$afterActivity', 2] } }
}
}
])
let outputYearsTotal = [stats[0].year1, stats[0].year2, stats[0].year3]
if (stats.length > 0) {
await Project.findByIdAndUpdate(projectId, {
$set: {
outputYearsTotal: outputYearsTotal
}
})
} else if (stats.length === 0) {
await Project.findByIdAndUpdate(projectId, {
$set: {
outputYearsTotal: [0, 0, 0]
}
})
}
}
Я могу без проблем удалять экземпляры до тех пор, пока не достигну последнего, когда я удаляю это, запрос возвращает «не может прочитать свойство« год1 »из неопределенного», что имеет смысл как агрегатная функция не имеет экземпляров, с которыми можно работать.
Как показано в коде выше, я попытался сбросить его, добавив массив нулей, если длина переменной 'stats' равна 0, однако это не работает.
Я думаю, что я смотрел на это слишком долго, по сути, все, что я хочу сделать, это убедиться, что если последний экземпляр этой модели, который соответствует запросу (ie принадлежит этому идентификатору проекта), будет удален, то Массив 'outputYearsTotal' в моем запросе findByIdAndUpdate сбрасывается в 0.