Функция агрегирования не работает при удалении последнего экземпляра на модели - PullRequest
0 голосов
/ 23 февраля 2020

У меня есть агрегатная функция, которая выдает результат массива верхнего уровня для моего '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.

1 Ответ

1 голос
/ 24 февраля 2020

add $ существует в начальном Match .. так что он также просматривает документы только там, где существует поле, что означает, что он будет равен 0, когда нет документов - что является значением git, а не броском ошибка

...