diff --git a/lib/services/query/castUpdate.js b/lib/services/query/castUpdate.js index fa519cc1907..c89de2cc902 100644 --- a/lib/services/query/castUpdate.js +++ b/lib/services/query/castUpdate.js @@ -193,7 +193,7 @@ function walkUpdatePath(schema, obj, op, strict, context, pref) { (utils.isObject(val) && Object.keys(val).length === 0); } } else { - var checkPath = (key === '$each' || key === '$or' || key === '$and') ? + var checkPath = (key === '$each' || key === '$or' || key === '$and' || key === '$in') ? pref : prefix + key; schematype = schema._getSchema(checkPath); diff --git a/test/query.test.js b/test/query.test.js index f5807a6e71e..7e273b24a15 100644 --- a/test/query.test.js +++ b/test/query.test.js @@ -918,6 +918,50 @@ describe('Query', function() { done(); }); + it('doesn\'t wipe out $in (gh-6439)', function(done) { + var embeddedSchema = new Schema({ + name: String + }, { _id: false }); + + var catSchema = new Schema({ + name: String, + props: [embeddedSchema] + }); + + var Cat = db.model('gh6439', catSchema); + var kitty = new Cat({ + name: 'Zildjian', + props: [ + { name: 'invalid' }, + { name: 'abc' }, + { name: 'def' } + ] + }); + + kitty.save(function(err) { + assert.ifError(err); + var cond = { _id: kitty._id }; + var update = { + $pull: { + props: { + $in: [ + { name: 'invalid' }, + { name: 'def' } + ] + } + } + }; + Cat.update(cond, update, function(err) { + assert.ifError(err); + Cat.findOne(cond, function(err, found) { + assert.ifError(err); + assert.strictEqual(found.props[0].name, 'abc'); + done(); + }); + }); + }); + }); + it('subdocument array with $ne: null should not throw', function(done) { var query = new Query({}, {}, null, p1.collection); var Product = db.model('Product');