猫鼬人口计数

时间:2019-04-24 13:48:35

标签: node.js mongoose count schema populate

我想知道有多少用户与我的办公室相关联,为此,我将count选项用于虚拟架构。

Office模式:

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 :(得分:0)

在幕后,Mongoose将对所有与找到的任何办公室ID匹配的用户进行查询,这可能是您知道的,这就是为什么您获得的总计数相同的原因。

但是,由于Mongoose将其作为单独的查询来执行,因此没有什么可以阻止您在挂机后执行相同的操作。参见group

因此,返回所有办公室后,您需要提取所有用户,按他们的办公室对他们进行分组(请参阅count),并计算每个结果组中的人数(请参见https://docs.mongodb.com/manual/reference/operator/aggregation/group/ )。

到此,您可能要考虑执行与聚合管道相同的操作,这可以在服务器端更有效地执行。 在为聚合模型方法编写组管道时,请参见以下内容: {{3}}