我想为与特定猫鼬模型相关的所有查询自动添加查询选项,而不会影响其他模型
我看到了answer,其中Mongoose.Query被修补,这将影响所有猫鼬模型。
答案 0 :(得分:2)
我认为有两种简单的方法可以做到这一点:
备选方案#1
添加一个静态字典,其中包含您要应用于特定Mongoose架构的选项:
FooSchema.statics.options = {
...
};
现在,当您查询时需要执行以下操作:
Foo.find({}, null, Foo.options, function(err, foos) {
...
});
备选方案#2
为始终使用特定选项的find方法实现包装器:
FooSchema.statics.findWithOptions = function(query, next) {
var options = { ... };
this.find(query, null, options, next);
};
并像这样使用这种方法:
Foo.findWithOptions({}, function(err, foos) {
...
})
<强>可重用性强>
为了使这些包装器方法更具可重用性,您可以使用所有包装器创建一个dict:
var withOptionsWrappers = {
findWithOptions: function(query, next) {
this.find(query, null, this.options, next);
},
findByIdWithOptions: ...
findOneWithOptions: ...
...
};
由于我们提到的是this
,因此重用此功能会没有问题。现在,将其应用于所有模式以及特定于模式的选项:
FooSchema.statics = withOptionsWrappers;
FooSchema.statics.options = {
...
};
BarSchema.statics = withOptionsWrappers;
BarSchema.statics.options = {
...
};
答案 1 :(得分:1)
我能够为我的软删除项目执行此操作。尽管如此,Haven还没有对它进行过广泛的测试。
function findNotDeletedMiddleware(next) {
this.where('deleted').equals(false);
next();
}
MySchema.pre('find', findNotDeletedMiddleware);
MySchema.pre('findOne', findNotDeletedMiddleware);
MySchema.pre('findOneAndUpdate', findNotDeletedMiddleware);
MySchema.pre('count', findNotDeletedMiddleware);