@ekopach

Mongoose: count к связным коллекциям

Доброго всем времени суток!
Изучаю Node.JS, для первого проекта выбрал связку Express + Mongoose, и уже столкнулся с рядом проблем.

Есть 2 модели:
var Institution = new mongoose.Schema({
    name: {
        type: String,
        required: [true, 'Поле "Название заведения" не может быть пустым']
    }
});
module.exports = mongoose.model('institution', Institution);

var Faculty = new mongoose.Schema({
    institution: {
        type: mongoose.Schema.ObjectId,
        ref: 'institution'
    },
    name: {
        type: String,
        required: [true, 'Поле "Название факультета" не может быть пустым']
    }
});
module.exports = mongoose.model('faculty', Faculty);

Чтобы получить все факультеты, которые принадлежат учебному заведению, делаю так:
Faculty.find({institution: institution._id}, function(err, faculties) {
 // ...
        });

Но теперь мне нужно вывести список учебных заведений, а напротив их количество факультетов.
Может кто подскажет как лучше сделать?

Пока такие мысли:

1. Завести поле __facultiesCount в схеме Institution и при добавлении нового факультета увеличивать это поле, а при удалении уменьшать на 1, но так получается некрасиво и много лишнего кода :) + данные могут быть не актуальны, если например я в БД руками удалю один факультет.

2. После выборки списка учебных заведений - проходить по ним и для каждого считать сколько факультетов каждый раз - но это не оптимально.

Может есть какой-то способ полегче?
  • Вопрос задан
  • 3286 просмотров
Пригласить эксперта
Ответы на вопрос 3
AMar4enko
@AMar4enko
Вам нужны факультеты отдельно от институтов?
Если нет, то пихайте факультеты внутрь инсттитутов. Тогда при выборке институтов у вас сразу будет массив факультетов.

В случае, если коллекции разные, вариантов кроме как вы описали, нет.
С полем __facultiesCount нормальное решение. Сделать отдельный метод для пересчета количеств и не удалять руками.
Ответ написан
Попробуйте populate, он вместо айдишников институтов в факультете подставит обьекты институтов из другой таблицы

Faculty.find({institution: institution._id}).populate('institution').exec( function(err, faculties) {
// ...
});
Ответ написан
icelaba
@icelaba
Знаю и умею всё
поле __facultiesCount почти без вариантов
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы