跳过或禁用mongoose模式save()调用的validation

我正在寻找创build一个新的文件,保存到mongodb无论有效。 我只是想暂时跳过模型保存调用mongoosevalidation。

在我的CSV导入的情况下,CSV文件中不包含一些必填字段,特别是其他文档的引用字段。 然后,下面的示例不会传递mongoosevalidation所需的检查:

var product = mongoose.model("Product", Schema({ name: { type: String, required: true }, price: { type: Number, required: true, default: 0 }, supplier: { type: Schema.Types.ObjectId, ref: "Supplier", required: true, default: {} } })); var data = { name: 'Test', price: 99 }; // this may be array of documents either product(data).save(function(err) { if (err) throw err; }); 

是否有可能让Mongoose知道在save()调用中不执行validation?

[编辑]

我或者尝试过Model.create() ,但它也调用validation过程。

虽然可能有办法禁用validation,我不知道你的select之一是使用不使用中间件的方法(因此没有validation)。 其中之一是直接访问Mongo驱动程序的插入 。

 Product.collection.insert({ item: "ABC1", details: { model: "14Q3", manufacturer: "XYZ Company" }, }, function(err, doc) { console.log(err); console.log(doc); }); 

从v4.4.2开始支持:

 doc.save({ validateBeforeSave: false }); 

您可以使用多个使用相同集合的模型,因此创build第二个模型时不需要使用CSV导入所需的字段限制:

 var rawProduct = mongoose.model("RawProduct", Schema({ name: String, price: Number }), 'products'); 

model的第三个参数提供了一个明确的集合名称,允许您使这个模型也使用products集合。

我可以通过replacevalidate方法来忽略validation并保留中间件行为:

 schema.method('saveWithoutValidation', function(next) { var defaultValidate = this.validate; this.validate = function(next) {next();}; var self = this; this.save(function(err, doc, numberAffected) { self.validate = defaultValidate; next(err, doc, numberAffected); }); }); 

我只用mongoose3.8.23testing过

  1. schema config validateBeforeSave = false
  2. 使用validate methed
 // define var GiftSchema = new mongoose.Schema({ name: {type: String, required: true}, image: {type: String} },{validateBeforeSave:false}); // use var it new Gift({...}); it.validate(function(err){ if (err) next(err) else it.save(function (err, model) { ... }); })