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

当你在Mongoose中定义一个模式时,你可以select{strict:false}

在定义模式之后是否有设置选项? 就像通过一个mongoose中间件或一个mongoose插件 ?

我想创build一个插件 ,将需要存储一些额外的数据到数据库,我不能够,除非插件用户已经设置{strict:false}或添加我想存储数据的字段他们的模式本身,这两者都不太可能。 所以我想知道是否有一种方法让我从我的插件代码本身发生?

Mongoose是一个ODM,在这方面的{strict: true}选项只适用于你通过Mongoose运行的查询,而不是在mongoDB方面执行,你的文档保持无模式。

但是您不必使用mongoose来完成所有的查询,您可以使用下面的本地mongoDB驱动程序来绕过所有这些。 mongoose甚至给你一个快捷方式,以Model.collection的forms做到这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'); }); 

编辑:

您可以禁用特定模型path的strict 。 我认为这是你要找的东西。

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

只是一个参考,我最终做的是创build一个子模式,然后在那里strict禁用..

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

 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 ) ) 

这似乎工作正常:)