Заселение мангуста - PullRequest
       26

Заселение мангуста

1 голос
/ 24 апреля 2019

Я хочу знать, сколько пользователей связано с моим офисом, и для этого я использую опцию подсчета для виртуальной схемы.

Схема офиса:

const OfficeSchema = mongoose.Schema({
  name: { type: String },
  admin: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
}, { toJSON: { virtuals: true } });

Схема пользователя:

const UserSchema = mongoose.Schema({
  email: { type: String, unique: true, required: true },
  first_name: { type: String },
  last_name: { type: String },
  office: { type: mongoose.Schema.Types.ObjectId, ref: 'Office' },
}, { toJSON: { virtuals: true } });

Офис-пользовательские отношения:

OfficeSchema.virtual('usersCount', {
  ref: 'User',
  localField: '_id',
  foreignField: 'office',
  justOne: false,
  count: true
});

Когда я добавляю аргумент запроса к методу find, он работает нормально, я получаю количество пользователей для определенного офиса.

Office.find({ admin: userId }).populate([
    { path: 'admin', select: '_id email first_name last_name' },
    { path: 'usersCount', select: '_id' }
  ]);

Но когда нет объекта запроса (то есть подсчитать все офисы и количество их пользователей), я получаю одинаковое количество пользователей для каждого офиса, общее количество. Я просто хочу получить ассоциированное количество пользователей для каждого офиса. Это возможно?

1 Ответ

0 голосов
/ 24 апреля 2019

За кулисами Mongoose собирается сделать запрос для всех пользователей, которые соответствуют любому из найденных офисных идентификаторов, как вы, вероятно, знаете, и именно поэтому вы получаете такой же счет по всем направлениям.

Но поскольку Mongoose делает это как отдельный запрос, ничто не мешает вам выполнить то же самое самостоятельно, в пост-хуке.См. https://mongoosejs.com/docs/middleware.html#post-async

Таким образом, при возврате всех офисов вам необходимо выбрать всех пользователей, выполнить группировку (см. group ) для них по их офисам и подсчитать число в каждомрезультирующая группа (см. count ).

К этому моменту вы можете захотеть выполнить то же самое, что и агрегатный конвейер, что может быть выполнено более эффективно на стороне сервера.Смотрите это при написании группового конвейера для метода агрегированной модели: https://docs.mongodb.com/manual/reference/operator/aggregation/group/

...