我想知道有多少用户与我的办公室相关联,为此,我将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' }
]);
但是,当没有查询对象时(意味着获取所有办公室及其用户计数),我得到每个办公室相同数量的用户,即总数。 我只想获取每个办公室的相关用户数。这可能吗?
答案 0 :(得分:0)
在幕后,Mongoose将对所有与找到的任何办公室ID匹配的用户进行查询,这可能是您知道的,这就是为什么您获得的总计数相同的原因。
但是,由于Mongoose将其作为单独的查询来执行,因此没有什么可以阻止您在挂机后执行相同的操作。参见group
因此,返回所有办公室后,您需要提取所有用户,按他们的办公室对他们进行分组(请参阅count),并计算每个结果组中的人数(请参见https://docs.mongodb.com/manual/reference/operator/aggregation/group/ )。
到此,您可能要考虑执行与聚合管道相同的操作,这可以在服务器端更有效地执行。 在为聚合模型方法编写组管道时,请参见以下内容: {{3}}