我有一个User模式,其激活字段为Boolean类型。我希望查询只返回activated: true
的文档。我希望有一种更有效和干燥的方法,比为每个find,findOne或findById添加一个条件。
什么是最有效的方法?
答案 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){ ... });