覆盖特定模型的mongoose查询

时间:2014-09-15 13:15:09

标签: node.js mongodb mongoose

我想为与特定猫鼬模型相关的所有查询自动添加查询选项,而不会影响其他模型

我看到了answer,其中Mongoose.Query被修补,这将影响所有猫鼬模型。

2 个答案:

答案 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);