diff --git a/test/connection.test.js b/test/connection.test.js index effc91d23cb..98919402d41 100644 --- a/test/connection.test.js +++ b/test/connection.test.js @@ -1720,7 +1720,8 @@ describe('connections:', function() { const Test = db.model('Test', new Schema({ name: { type: String, required: true } })); await Test.deleteMany({}); - await db.bulkWrite([{ model: 'Test', name: 'insertOne', document: { name: 'test1' } }]); + const res = await db.bulkWrite([{ model: 'Test', name: 'insertOne', document: { name: 'test1' } }]); + assert.equal(res.insertedCount, 1); assert.ok(await Test.exists({ name: 'test1' })); await db.bulkWrite([{ model: Test, name: 'insertOne', document: { name: 'test2' } }]); diff --git a/test/types/connection.test.ts b/test/types/connection.test.ts index 29ddf02b3ba..77ca1787685 100644 --- a/test/types/connection.test.ts +++ b/test/types/connection.test.ts @@ -154,3 +154,20 @@ function schemaInstanceMethodsAndQueryHelpersOnConnection() { const TestModel = connection.model('User', userSchema); } + +async function gh15359() { + const res = await conn.bulkWrite([{ model: 'Test', name: 'insertOne', document: { name: 'test1' } }]); + expectType(res.insertedCount); + expectError(res.mongoose.validationErrors); + + const res2 = await conn.bulkWrite([{ model: 'Test', name: 'insertOne', document: { name: 'test2' } }], { ordered: false }); + expectType(res2.insertedCount); + expectType(res2.mongoose?.validationErrors); + + const res3 = await conn.bulkWrite([ + { model: 'Test', name: 'updateOne', filter: { name: 'test5' }, update: { $set: { num: 42 } } }, + { model: 'Test', name: 'updateOne', filter: { name: 'test4' }, update: { $set: { num: 'not a number' } } } + ], { ordered: false }); + expectType(res3.insertedCount); + expectType(res3.mongoose?.validationErrors); +} diff --git a/types/connection.d.ts b/types/connection.d.ts index 0e5380aec04..4984e2a335c 100644 --- a/types/connection.d.ts +++ b/types/connection.d.ts @@ -58,12 +58,34 @@ declare module 'mongoose' { sanitizeFilter?: boolean; } + export type AnyConnectionBulkWriteModel = Omit, 'namespace'> + | Omit, 'namespace'> + | Omit, 'namespace'> + | Omit, 'namespace'> + | Omit, 'namespace'> + | Omit, 'namespace'>; + + export type ConnectionBulkWriteModel = Record> = { + [ModelName in keyof SchemaMap]: AnyConnectionBulkWriteModel & { + model: ModelName; + }; + }[keyof SchemaMap]; + class Connection extends events.EventEmitter implements SessionStarter { aggregate(pipeline?: PipelineStage[] | null, options?: AggregateOptions): Aggregate>; /** Returns a promise that resolves when this connection successfully connects to MongoDB */ asPromise(): Promise; + bulkWrite>( + ops: Array>, + options: mongodb.ClientBulkWriteOptions & { ordered: false } + ): Promise } }>; + bulkWrite>( + ops: Array>, + options?: mongodb.ClientBulkWriteOptions + ): Promise; + /** Closes the connection */ close(force?: boolean): Promise;