From a5c6f8e644275923ad44cad34d23c3afbf2d9566 Mon Sep 17 00:00:00 2001 From: Valeri Karpov Date: Thu, 29 Sep 2022 15:29:13 -0400 Subject: [PATCH 1/2] fix(query): treat `findOne(_id)` as equivalent to `findOne({ _id })` Fix #12325 --- lib/query.js | 4 ++++ test/helpers/update.castArrayFilters.test.js | 5 +++-- test/query.test.js | 11 +++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) 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..0397ac3c6ce 100644 --- a/test/query.test.js +++ b/test/query.test.js @@ -4132,4 +4132,15 @@ 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(); + + const q = Test.find(_id); + + assert.ok(q.getFilter()._id instanceof mongoose.Types.ObjectId); + assert.equal(q.getFilter()._id.toHexString(), _id.toHexString()); + }); }); From a40844eb9308491494a8be1c3e7b516b3b29c310 Mon Sep 17 00:00:00 2001 From: Valeri Karpov Date: Thu, 29 Sep 2022 20:47:34 -0400 Subject: [PATCH 2/2] test: add coverage for `findOne(ObjectId)` --- test/query.test.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/test/query.test.js b/test/query.test.js index 0397ac3c6ce..0b3a6af2339 100644 --- a/test/query.test.js +++ b/test/query.test.js @@ -4138,7 +4138,12 @@ describe('Query', function() { const Test = db.model('Test', testSchema); const _id = new mongoose.Types.ObjectId(); - const q = Test.find(_id); + 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());