猫鼬:是否可以在定义模式后设置 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 ) )
这似乎工作正常:)
当您在 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 ) )
这似乎工作正常:)