From b99f6d37f00f49a2de38d6b777fced781995c57a Mon Sep 17 00:00:00 2001 From: Valeri Karpov Date: Sun, 10 May 2020 13:08:40 -0400 Subject: [PATCH] BREAKING CHANGE: make `MongooseArray#map()` return a plain JavaScript array rather than a headless Mongoose array Re: #8356 --- lib/plugins/idGetter.js | 4 +++- lib/types/documentarray.js | 7 ++----- test/types.documentarray.test.js | 5 +++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/plugins/idGetter.js b/lib/plugins/idGetter.js index 39254c0074e..f432a83288a 100644 --- a/lib/plugins/idGetter.js +++ b/lib/plugins/idGetter.js @@ -11,10 +11,12 @@ module.exports = function addIdGetter(schema) { !schema.options.noVirtualId && schema.options.id; if (!autoIdGetter) { - return; + return schema; } schema.virtual('id').get(idGetter); + + return schema; }; /*! diff --git a/lib/types/documentarray.js b/lib/types/documentarray.js index 35d152859a6..72dfa95fc23 100644 --- a/lib/types/documentarray.js +++ b/lib/types/documentarray.js @@ -39,12 +39,9 @@ class CoreDocumentArray extends CoreMongooseArray { */ map() { - const ret = super.map.apply(this, arguments); - ret[arraySchemaSymbol] = null; - ret[arrayPathSymbol] = null; - ret[arrayParentSymbol] = null; + const copy = [].concat(this); - return ret; + return Array.prototype.map.apply(copy, arguments); } /** diff --git a/test/types.documentarray.test.js b/test/types.documentarray.test.js index 8cf6529125a..c5ee41248bf 100644 --- a/test/types.documentarray.test.js +++ b/test/types.documentarray.test.js @@ -10,6 +10,7 @@ const DocumentArray = require('../lib/types/documentarray'); const ArraySubdocument = require('../lib/types/ArraySubdocument'); const assert = require('assert'); const co = require('co'); +const idGetter = require('../lib/plugins/idGetter'); const setValue = require('../lib/utils').setValue; const mongoose = require('./common').mongoose; @@ -39,7 +40,7 @@ function TestDoc(schema) { title: { type: String } }); - Subdocument.prototype.$__setSchema(schema || SubSchema); + Subdocument.prototype.$__setSchema(idGetter(schema || SubSchema)); return Subdocument; } @@ -575,7 +576,7 @@ describe('types.documentarray', function() { assert.equal(doc.docs.length, 2); }); - it('map() works', function() { + it('map() works (gh-8317)', function() { const personSchema = new Schema({ friends: [{ name: { type: String } }] }); mongoose.deleteModel(/Test/); const Person = mongoose.model('Test', personSchema);