Mongoose 虚拟机中的 Where 选项

Where option in Mongoose virtuals

我正在尝试获取已填充项目的数量作为响应,但我想在计数之前过滤已填充的数据。

例子

Team.virtual('membersOlderThan18', {
  ref: 'Member',
  localField: 'team',
  foreignField: '_id',
  count: true // Set `count: true` on the virtual
  options: { HERE IF AGE > 18 }
});

我不确定这是否可行,因为我找不到任何相关示例。

很简单,你不能。在数据已经返回给您的客户端之后,并且在 mongoose 将其交给您之前,添加虚拟机。 MongoDB 不记得 Mongoose 虚拟机,因此不能在查询中使用它们。

但是,您可以像这样直接查询 members 集合来完成同样的事情:

Member.find({
  teamId: '<the_team_id>',
  age: {$gt: 18}
});

我同意@chrispytoes 提供的答案。但是,您也可以实现一个查询中间件(也称为 'hook'),它允许您在执行某个查询之前或之后执行 运行 函数。在这种情况下,您需要一个预查找挂钩,它将在实际执行查询之前执行:

yourSchema.pre(/^find/, function(next) {
    this.find({ age: { $gt: 18 } });
    next();
});

我使用了一个正则表达式 (/^find/),这样这个中间件将针对 Mongoose 中的每个查找方法执行(例如 findfindById 等),但这确实取决于您希望在查询中实现的功能。