diff --git a/lib/query.js b/lib/query.js index 61c15f44419..30e85f7985b 100644 --- a/lib/query.js +++ b/lib/query.js @@ -2402,6 +2402,10 @@ Query.prototype.merge = function(source) { utils.merge(this._mongooseOptions, source._mongooseOptions); + return this; + } else if (this.model != null && source instanceof this.model.base.Types.ObjectId) { + utils.merge(this._conditions, { _id: source }, opts); + return this; } diff --git a/test/helpers/update.castArrayFilters.test.js b/test/helpers/update.castArrayFilters.test.js index c4a7420010b..6baad3f8474 100644 --- a/test/helpers/update.castArrayFilters.test.js +++ b/test/helpers/update.castArrayFilters.test.js @@ -2,6 +2,7 @@ const Query = require('../../lib/query'); const Schema = require('../../lib/schema'); +const Types = require('../../lib/types'); const assert = require('assert'); const castArrayFilters = require('../../lib/helpers/update/castArrayFilters'); @@ -231,7 +232,7 @@ describe('castArrayFilters', function() { }); let q = new Query(); q.schema = schema; - q.model = { base: { options: { strictQuery: false } } }; + q.model = { base: { Types, options: { strictQuery: false } } }; let p = { 'arr.$[arr].id': 42 }; let opts = { @@ -247,7 +248,7 @@ describe('castArrayFilters', function() { q = new Query(); q.schema = schema; - q.model = { base: { options: { strictQuery: true } } }; + q.model = { base: { Types, options: { strictQuery: true } } }; p = { 'arr.$[arr].id': 42 }; opts = { diff --git a/test/query.test.js b/test/query.test.js index 59698e99fdb..0b3a6af2339 100644 --- a/test/query.test.js +++ b/test/query.test.js @@ -4132,4 +4132,20 @@ describe('Query', function() { assert.equal(item.get('select.key.some'), 'value'); assert.equal(item.doNotSelect, undefined); }); + + it('treats ObjectId as object with `_id` for `merge()` (gh-12325)', async function() { + const testSchema = new mongoose.Schema({ name: String }); + const Test = db.model('Test', testSchema); + const _id = new mongoose.Types.ObjectId(); + + let q = Test.find(_id); + + assert.ok(q.getFilter()._id instanceof mongoose.Types.ObjectId); + assert.equal(q.getFilter()._id.toHexString(), _id.toHexString()); + + q = Test.findOne(_id); + + assert.ok(q.getFilter()._id instanceof mongoose.Types.ObjectId); + assert.equal(q.getFilter()._id.toHexString(), _id.toHexString()); + }); });