【问题标题】:MongooseJS: Hide Specific Documents From QueryMongooseJS:从查询中隐藏特定文档
【发布时间】:2016-03-29 12:47:22
【问题描述】:

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

什么是最有效的方法?

【问题讨论】:

  • 干法似乎是最好的方法。

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


【解决方案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);
});

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

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

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

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

【讨论】:

  • " 根据尝试使用其他语言和数据库系统的经验,您将在某些时候想要/需要加载未激活的项目。"这是说服我使用您的方法的一个很好的论据。另外,通过添加一个布尔值作为第二个参数,我可以告诉函数 findOne 或查找与查询匹配的所有文档。谢谢。
【解决方案2】:

你可能想看看猫鼬Query middlewarehere

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

  • 计数
  • 找到
  • 找到一个
  • ...

例如:

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

【讨论】:

  • 是不是和他想避免的 db.user.find({activated:true}) 一样?
  • @AJS 的目标是不要将其添加到每个请求中,而是将其添加到顶部的某个位置(然后自动使用)。
  • 感谢您的意见。我想到了查询的预钩子。但是我必须为每个查询帮助函数编写一个,不是吗?
猜你喜欢
  • 1970-01-01
  • 2013-12-15
  • 1970-01-01
  • 2021-12-06
  • 2023-02-10
  • 1970-01-01
  • 1970-01-01
  • 2012-12-07
  • 2014-11-21
相关资源
最近更新 更多