NodeJS 在Mongoose模式中禁用插件

w8biq8rn  于 2023-06-22  发布在  Node.js
关注(0)|答案(2)|浏览(158)

我正在使用Mongoose插件(mongoose-patch-history),它可以自动跟踪MongoDB集合中模型的更改。我需要选择性地禁用插件(即.我只想跟踪某些模型的更改,而不是其他模型,基于标志/标准)。我相信我需要在插件中提供某种过滤功能,但它没有提供这种机制。有没有其他方法可以做到这一点?

1sbrub3j

1sbrub3j1#

插件在模式上设置中间件。在我的例子中,插件timestamp注册了这个中间件

schema.pre('findOneAndUpdate', function (next) {
    if (this.op === 'findOneAndUpdate') {
        this._update = this._update || {};
        this._update[updatedAt] = new Date;
        this._update['$setOnInsert'] = this._update['$setOnInsert'] || {};
        this._update['$setOnInsert'][createdAt] = new Date;
    }
});

我无法设法从模式中删除这个中间件 (这里是关于如何访问注册的中间件)

解决方案

我用完全相同的SchemaType创建了一个新的Schema示例。然后我避免添加插件。
要创建具有相同schemaType的模式,只需访问属性paths

import _ from 'lodash'
import mongoose from 'mongoose'
// schema with plugin
import EntitySchema from '../entity.model'

// creating clone of paths for cleanliness
const schemaType = _.cloneDeep(EntitySchema.paths)

// new schema, free of plugins
const newSchema = new mongoose.Schema(schemaType)
zi8p0yeb

zi8p0yeb2#

您可以通过名称搜索插件,并从mongoose.plugins列表中删除特定索引:

const removePluginByName = (name) => {
    const index = mongoose.plugins.findIndex(
        ([p]) => p.name !== name
    );
    mongoose.plugins.splice(index, 1);
};

相关问题