diff --git a/packages/mongo/mongo_driver.js b/packages/mongo/mongo_driver.js index 4cc97f310f..18540ecb07 100644 --- a/packages/mongo/mongo_driver.js +++ b/packages/mongo/mongo_driver.js @@ -514,10 +514,20 @@ MongoConnection.prototype._update = function (collection_name, selector, mod, }; var isModificationMod = function (mod) { - for (var k in mod) - if (k.substr(0, 1) === '$') - return true; - return false; + var isReplace = false; + var isModify = false; + for (var k in mod) { + if (k.substr(0, 1) === '$') { + isModify = true; + } else { + isReplace = true; + } + } + if (isModify && isReplace) { + throw new Error( + "Update parameter cannot have both modifier and non-modifier fields."); + } + return isModify; }; var NUM_OPTIMISTIC_TRIES = 3; diff --git a/packages/mongo/mongo_livedata_tests.js b/packages/mongo/mongo_livedata_tests.js index 686992dfb0..75e351396d 100644 --- a/packages/mongo/mongo_livedata_tests.js +++ b/packages/mongo/mongo_livedata_tests.js @@ -3068,7 +3068,7 @@ Meteor.isServer && testAsyncMulti("mongo-livedata - update with replace forbidde test.throws(function () { c.update(id, { foo3: "bar3", $set: { blah: 1 } }); - }, "cannot be mixed"); + }, "cannot have both modifier and non-modifier fields"); test.equal(c.findOne(id), { _id: id, foo2: "bar2" }); } ]);