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

Node.js MongooseJS:从查询中隐藏特定文档,node.js,mongodb-query,mongoose-schema,Node.js,Mongodb Query,Mongoose Schema,我有一个带有布尔类型的激活字段的用户模式。我希望查询只返回激活了的文档:true。我希望有一种比在每个find、findOne或findById中添加条件更有效、更干练的方法 最有效的方法是什么?您可能想看看Mongoose查询中间件 以下模型和查询支持查询中间件 功能 计数 发现 芬顿 例如: User.pre('find', function() { console.log(this instanceof mongoose.Query); // true this.activa

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


最有效的方法是什么?

您可能想看看Mongoose
查询中间件

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

  • 计数
  • 发现
  • 芬顿
例如:

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

您可能想看看Mongoose
查询中间件

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

  • 计数
  • 发现
  • 芬顿
例如:

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

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

从尝试使用其他语言和数据库系统执行此操作的经验来看,在某些情况下,您可能希望/需要加载未激活的项。但是如果你总是只返回激活的项目,你将永远无法得到你需要的列表

出于您的目的,我建议在您的模式上创建
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);
});
使用此方法,您将拥有一个与
findOne
相同的
findActive
方法,但它将始终筛选激活的项目

MyModel.findActive(函数(err,modelist){…})

它还可以选择支持其他查询过滤器


MyModel.findActive({some:“stuff”},函数(err,modelist){…})

虽然可能有办法做到这一点,但通常最好总是隐藏此信息

从尝试使用其他语言和数据库系统执行此操作的经验来看,在某些情况下,您可能希望/需要加载未激活的项。但是如果你总是只返回激活的项目,你将永远无法得到你需要的列表

出于您的目的,我建议在您的模式上创建
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);
});
使用此方法,您将拥有一个与
findOne
相同的
findActive
方法,但它将始终筛选激活的项目

MyModel.findActive(函数(err,modelist){…})

它还可以选择支持其他查询过滤器


MyModel.findActive({some:“stuff”},函数(err,modelist){…})

干法似乎是最好的方法。干法似乎是最好的方法。它与db.user.find({activated:true})不一样,他想避免使用它吗?@AJS的目标不是将它添加到每个请求中,而是将它添加到顶部的某个位置(然后自动使用)。感谢您的输入。我想到了查询的预钩子。但是我必须为每个查询助手函数编写一个,不是吗?它与db.user.find({activated:true})不一样,他希望避免使用它吗?@AJS的目标不是将它添加到每个请求中,而是将它添加到顶部的某个位置(然后自动使用)。感谢您的输入。我想到了查询的预钩子。但我必须为每个查询助手函数编写一个,不是吗?“从尝试使用其他语言和数据库系统执行此操作的经验来看,在某个时候,您会希望/需要加载未激活的项。”这是说服我使用您的方法的一个非常好的理由。另外,通过添加一个布尔值作为第二个参数,我可以告诉函数findOne或查找与查询匹配的所有文档。谢谢。“根据在其他语言和数据库系统中尝试这样做的经验,在某个时候,您会希望/需要加载未激活的项。”这是说服我使用您的方法的一个非常好的理由。另外,通过添加一个布尔值作为第二个参数,我可以告诉函数findOne或查找与查询匹配的所有文档。谢谢