MongooseJS:从查询中隐藏特定文档

时间:2016-03-29 12:47:22

标签: node.js mongodb-query mongoose-schema

我有一个User模式,其激活字段为Boolean类型。我希望查询只返回activated: true的文档。我希望有一种更有效和干燥的方法,比为每个find,findOne或findById添加一个条件。

什么是最有效的方法?

2 个答案:

答案 0 :(得分:1)

您可能希望查看Mongoose Query middleware here

  

以下模型和查询支持查询中间件   功能

     
      
  • count
  •   
  • 找到
  •   
  • findOne
  •   
  • ...
  •   

例如:

User.pre('find', function() {
  console.log(this instanceof mongoose.Query); // true
  this.activated = true;
});

答案 1 :(得分: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){ ... });