diff --git a/lib/helpers/model/castBulkWrite.js b/lib/helpers/model/castBulkWrite.js index f4e15648979..f724afb0b31 100644 --- a/lib/helpers/model/castBulkWrite.js +++ b/lib/helpers/model/castBulkWrite.js @@ -34,6 +34,9 @@ module.exports = function castBulkWrite(model, op, options) { op = op['updateOne']; return (callback) => { try { + if (!op['filter']) throw new Error('Must provide a filter object.'); + if (!op['update']) throw new Error('Must provide an update object.'); + op['filter'] = cast(model.schema, op['filter']); op['update'] = castUpdate(model.schema, op['update'], { strict: model.schema.options.strict, @@ -61,6 +64,9 @@ module.exports = function castBulkWrite(model, op, options) { op = op['updateMany']; return (callback) => { try { + if (!op['filter']) throw new Error('Must provide a filter object.'); + if (!op['update']) throw new Error('Must provide an update object.'); + op['filter'] = cast(model.schema, op['filter']); op['update'] = castUpdate(model.schema, op['update'], { strict: model.schema.options.strict, diff --git a/test/model.test.js b/test/model.test.js index f51cd13e094..0ab154470aa 100644 --- a/test/model.test.js +++ b/test/model.test.js @@ -5674,6 +5674,34 @@ describe('Model', function() { then(() => Model.findOne()). then(doc => assert.equal(doc.nested.name, 'foo')); }); + + it('throws an error if no update object is provided (gh-8331)', function() { + const userSchema = new Schema({ name: { type: String, required: true } }); + const User = db.model('gh8331', userSchema); + + return co(function*() { + const createdUser = yield User.create({ name: 'Hafez' }); + let threw = false; + try { + yield User.bulkWrite([{ + updateOne: { + filter: { _id: createdUser._id } + } + }]); + } + catch (err) { + threw = true; + assert.equal(err.message, 'Must provide an update object.'); + } + finally { + assert.equal(threw, true); + + const userAfterUpdate = yield User.findOne({ _id: createdUser._id }); + + assert.equal(userAfterUpdate.name, 'Hafez', 'Document data is not wiped if no update object is provided.'); + } + }); + }); }); it('insertMany with Decimal (gh-5190)', function(done) {