猫鼬:是否可以在定义模式后设置 strict:false,比如通过中间件或插件?

Mongoose: Is it possible to set strict:false after defining the schema, like through a middleware or a plugin?

当您在 Mongoose 中定义模式时,您可以选择设置 {strict:false}

在您已经定义架构后,是否可以选择设置?喜欢通过 mongoose middleware or a mongoose plugin?

我想创建一个 plugin,它需要将一些额外的数据存储到数据库中,除非插件用户设置了 {strict:false} 或添加了我希望自己将数据存储在它们的模式中的字段,这两种情况都不太可能。所以我想知道是否有办法通过我的插件代码本身实现这一点?

Mongoose 是一个 ODM,在这方面的 {strict: true} 选项仅适用于通过 Mongoose 运行 查询,它不会在 mongoDB 端强制执行,您的文档保持无模式.

但是您不必使用 mongoose 来进行所有查询,您可以使用下面的本机 mongoDB 驱动程序来绕过所有这些。 Mongoose 甚至以 Model.collection 的形式为您提供了一个快捷方式。这是一个例子:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var PersonSchema = new Schema({
    name: String
}, {
    strict: true
});

var Person = mongoose.model('Person', PersonSchema);

mongoose.connect('mongodb://localhost/test', function(err) {
    if (err) {
        throw err;
    }

    Person.collection.insert({
        name: 'Bill',
        extraProp: 'Hello World'
    }, function(err, result) {
            if (err) {
                throw err;
            }
            console.log(result);
        });
    console.log('Connected');
});

编辑:

您可以为特定模型路径禁用 strict。我认为这更符合您的需求。

PersonSchema.pre('save', function(next) {
    this.set('extraProp', 'hello', {
        strict: false
    });
    next();
});

仅供参考,我最后做的是创建一个子模式,然后在其中禁用 strict..

我这样做是为了元数据,它是非结构化的,所以这是我的例子:

module.exports = Mongoose => {
    const Schema = Mongoose.Schema

    const metaSchema = new Schema({},{ strict: false })

    const modelSchema = new Schema({
        title: Schema.Types.String,
        metaData: metaSchema
    })

    modelSchema.statics.createMeta = function( title, meta, cb ) {
        return new this({
            title: title,
            metaData: meta
        }).save()
    }

    return Mongoose.model( 'Foobar', modelSchema )
}

然后使用它:

Foobar.createMeta( 'blah blah', {
    foo: 'AA',
    bar: 'BB'
} )
    .then( data =>  console.log( '# RESULT:', data ) )
    .catch( err => console.error( 'ERROR:',err ) )

这似乎工作正常:)