Skip to content

Commit 28da36b

Browse files
committed
fix(model): add skipValidation option for bulkWrite() to allow skipping validation for insertOne and replaceOne
Fix #11663
1 parent 55ff290 commit 28da36b

File tree

3 files changed

+19
-2
lines changed

3 files changed

+19
-2
lines changed

lib/helpers/model/castBulkWrite.js

+12
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@ module.exports = function castBulkWrite(originalModel, op, options) {
2727
doc.$session(options.session);
2828
}
2929
op['insertOne']['document'] = doc;
30+
31+
if (options.skipValidation || op['insertOne'].skipValidation) {
32+
callback(null);
33+
return;
34+
}
35+
3036
op['insertOne']['document'].$validate({ __noPromise: true }, function(error) {
3137
if (error) {
3238
return callback(error, null);
@@ -154,6 +160,12 @@ module.exports = function castBulkWrite(originalModel, op, options) {
154160
}
155161
op['replaceOne']['replacement'] = doc;
156162

163+
if (options.skipValidation || op['replaceOne'].skipValidation) {
164+
op['replaceOne']['replacement'] = op['replaceOne']['replacement'].toBSON();
165+
callback(null);
166+
return;
167+
}
168+
157169
op['replaceOne']['replacement'].$validate({ __noPromise: true }, function(error) {
158170
if (error) {
159171
return callback(error, null);

lib/model.js

+1
Original file line numberDiff line numberDiff line change
@@ -3581,6 +3581,7 @@ function _setIsNew(doc, val) {
35813581
* @param {String|number} [options.w=1] The [write concern](https://docs.mongodb.com/manual/reference/write-concern/). See [`Query#w()`](/docs/api.html#query_Query-w) for more information.
35823582
* @param {number} [options.wtimeout=null] The [write concern timeout](https://docs.mongodb.com/manual/reference/write-concern/#wtimeout).
35833583
* @param {Boolean} [options.j=true] If false, disable [journal acknowledgement](https://docs.mongodb.com/manual/reference/write-concern/#j-option)
3584+
* @param {Boolean} [options.skipValidation=false] Set to true to skip Mongoose schema validation on bulk write operations. Mongoose currently runs validation on `insertOne` and `replaceOne` operations by default.
35843585
* @param {Boolean} [options.bypassDocumentValidation=false] If true, disable [MongoDB server-side schema validation](https://docs.mongodb.com/manual/core/schema-validation/) for all writes in this bulk.
35853586
* @param {Boolean} [options.strict=null] Overwrites the [`strict` option](/docs/guide.html#strict) on schema. If false, allows filtering and writing fields not defined in the schema for all writes in this bulk.
35863587
* @param {Function} [callback] callback `function(error, bulkWriteOpResult) {}`

types/index.d.ts

+6-2
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,10 @@ declare module 'mongoose' {
237237

238238
export type HydratedDocument<DocType, TMethodsAndOverrides = {}, TVirtuals = {}> = DocType extends Document ? Require_id<DocType> : (Document<unknown, any, DocType> & Require_id<DocType> & TVirtuals & TMethodsAndOverrides);
239239

240+
interface MongooseBulkWriteOptions {
241+
skipValidation?: boolean;
242+
}
243+
240244
interface IndexesDiff {
241245
/** Indexes that would be created in mongodb. */
242246
toCreate: Array<any>
@@ -277,8 +281,8 @@ declare module 'mongoose' {
277281
* if you use `create()`) because with `bulkWrite()` there is only one network
278282
* round trip to the MongoDB server.
279283
*/
280-
bulkWrite(writes: Array<any>, options?: mongodb.BulkWriteOptions): Promise<mongodb.BulkWriteResult>;
281-
bulkWrite(writes: Array<any>, options?: mongodb.BulkWriteOptions, cb?: Callback<mongodb.BulkWriteResult>): void;
284+
bulkWrite(writes: Array<any>, options?: mongodb.BulkWriteOptions & MongooseBulkWriteOptions): Promise<mongodb.BulkWriteResult>;
285+
bulkWrite(writes: Array<any>, options?: mongodb.BulkWriteOptions & MongooseBulkWriteOptions, cb?: Callback<mongodb.BulkWriteResult>): void;
282286

283287
/**
284288
* Sends multiple `save()` calls in a single `bulkWrite()`. This is faster than

0 commit comments

Comments
 (0)