TypeScript中的Mongoose自定义查询助手

时间:2017-08-17 15:52:02

标签: typescript mongoose

我正在使用Mongoose的query helpers为我的架构添加一些功能,例如,排除软删除的项目:

schema.query.excludeDeleted = function() {
    return this.where({
        isDeleted: false
    })
};

我可以输入此功能(排序)好,虽然@types包中没有query

(schema as any).query.excludeDeleted = function(this: Query<MyDocument>) {
    return this.where({
        isDeleted: false
    })
};

我遇到的问题是当我使用这些功能时,例如

const documents = await MyDocument.find({}).excludeDeleted();

将失败TS编译,因为DocumentQuery(由find()返回)不存在excludeDeleted。明显的hacky解决方案是:

const documents = await (MyDocument.find({}) as any).excludeDeleted();

但这意味着我丢失了所有输入信息,并且使这些功能更难以使用。

我已经能够找到键入模型的静态函数的方法,但不能查询助手,所以任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

我也一直在遇到这个问题,并且发现你的工作很烦人(与你真的一样)。

如果你对每个find / findOne查询都不熟悉,你可以添加一个在查询执行之前运行的查询钩子。在钩子中,它只是将过滤添加到查询中以检查软删除的文档。钩子完成后,它将被执行。

在我的场景中,我需要在每次从数据库检索时过滤软删除的文档,因此使用钩子而不是查询助手是有意义的。但是取决于你的情况。

schema.pre("find", function(this: Query) {
  return this.where("isDeleted").equals(false);
});
schema.pre("findOne", function(this: Query) {
  return this.where("isDeleted").equals(false);
});

http://mongoosejs.com/docs/middleware.html