From d48cfa111323f5b73233f4cd00b7eaa70a7a0006 Mon Sep 17 00:00:00 2001 From: Valeri Karpov Date: Wed, 26 Aug 2020 21:19:26 -0400 Subject: [PATCH] fix(queryhelpers): avoid path collision error when projecting in discriminator key with `.$` Re: #9361 --- lib/queryhelpers.js | 2 +- test/model.discriminator.test.js | 18 +++++++++++------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/lib/queryhelpers.js b/lib/queryhelpers.js index 53a6f613613..d0e93b65b42 100644 --- a/lib/queryhelpers.js +++ b/lib/queryhelpers.js @@ -261,7 +261,7 @@ exports.applyPaths = function applyPaths(fields, schema) { let cur = ''; for (let i = 0; i < pieces.length; ++i) { cur += (cur.length === 0 ? '' : '.') + pieces[i]; - const projection = get(fields, cur, false); + const projection = get(fields, cur, false) || get(fields, cur + '.$', false); if (projection && typeof projection !== 'object') { return; } diff --git a/test/model.discriminator.test.js b/test/model.discriminator.test.js index cc1838aa2cc..0b50a0b6b07 100644 --- a/test/model.discriminator.test.js +++ b/test/model.discriminator.test.js @@ -762,31 +762,35 @@ describe('model', function() { it('with $meta projection (gh-5859)', function() { const eventSchema = new Schema({ eventField: String }, { id: false }); + eventSchema.index({ eventField: 'text' }); const Event = db.model('Test', eventSchema); const trackSchema = new Schema({ trackField: String }); const Track = Event.discriminator('Track', trackSchema); const trackedItem = new Track({ - trackField: 'trackField', - eventField: 'eventField' + trackField: 'track', + eventField: 'event' }); return trackedItem.save(). + then(() => Event.init()). then(function() { - return Event.find({}).select({ score: { $meta: 'textScore' } }); + return Event.find({ $text: { $search: 'event' } }). + select({ score: { $meta: 'textScore' } }); }). then(function(docs) { assert.equal(docs.length, 1); - assert.equal(docs[0].trackField, 'trackField'); + assert.equal(docs[0].trackField, 'track'); }). then(function() { - return Track.find({}).select({ score: { $meta: 'textScore' } }); + return Track.find({ $text: { $search: 'event' } }). + select({ score: { $meta: 'textScore' } }); }). then(function(docs) { assert.equal(docs.length, 1); - assert.equal(docs[0].trackField, 'trackField'); - assert.equal(docs[0].eventField, 'eventField'); + assert.equal(docs[0].trackField, 'track'); + assert.equal(docs[0].eventField, 'event'); }); });