0

我有一个带有布尔类型激活字段的用户模式。我希望查询只返回具有activated: true. 我希望有一种比为每个 find、findOne 或 findById 添加条件更有效和更干的方法。

什么是最有效的方法?

4

2 回答 2

1

您可能想在Query middleware 这里查看 Mongoose

以下模型和查询函数支持查询中间件。

  • 数数
  • 寻找
  • 找一个
  • ...

例如:

User.pre('find', function() {
  console.log(this instanceof mongoose.Query); // true
  this.activated = true;
});
于 2016-03-29T13:18:00.010 回答
1

虽然可能有一些方法可以做到这一点,但总是隐藏这些信息通常是个坏主意。

根据尝试使用其他语言和数据库系统执行此操作的经验,您将在某些时候想要/需要加载未激活的项目。但是如果你总是并且只返回激活的项目,你将永远无法获得你需要的列表。

出于您的目的,我建议findActive在您的架构上创建一个方法:


someSchema.static("findActive", function(query, cb){
  // check if there is a query and callback
  if (!cb){
    cb = query;
    query = {};
  }

  // set up an empty query, if there isn't one provided
  if (!query) { query = {}; }

  // make sure you only load activated items
  query.activated = true;

  // run the query
  this.find(query, cb);
});

使用此方法,您将拥有findActive与 相同的方法findOne,但它始终会过滤已激活的项目。

MyModel.findActive(function(err, modelList){ ... });

并且它可以选择支持额外的查询过滤器

MyModel.findActive({some: "stuff"}, function(err, modelList){ ... });

于 2016-03-29T13:49:18.443 回答