diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c6be5a0e5..f14509b6e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -96,6 +96,7 @@ ___ - Remove support for MongoDB 3.6 which has reached its End-of-Life date and PostgreSQL 10 (Manuel Trezza) [#7315](https://github.com/parse-community/parse-server/pull/7315) - Remove support for Node 10 which has reached its End-of-Life date (Manuel Trezza) [#7314](https://github.com/parse-community/parse-server/pull/7314) - Remove S3 Files Adapter from Parse Server, instead install separately as `@parse/s3-files-adapter` (Manuel Trezza) [#7324](https://github.com/parse-community/parse-server/pull/7324) +- Fix explain for mongoDB which was returning a single object for query results instead of an array of objects. This conflicts with the rest of the find query server responses as find is always suppose to return an array (Corey Baker) [#7440](https://github.com/parse-community/parse-server/pull/7440) ### Notable Changes - Added Parse Server Security Check to report weak security settings (Manuel Trezza, dblythy) [#7247](https://github.com/parse-community/parse-server/issues/7247) - EXPERIMENTAL: Added new page router with placeholder rendering and localization of custom and feature pages such as password reset and email verification (Manuel Trezza) [#7128](https://github.com/parse-community/parse-server/pull/7128) diff --git a/spec/MongoStorageAdapter.spec.js b/spec/MongoStorageAdapter.spec.js index f6d2866417..af2f4e3492 100644 --- a/spec/MongoStorageAdapter.spec.js +++ b/spec/MongoStorageAdapter.spec.js @@ -338,8 +338,8 @@ describe_only_db('mongo')('MongoStorageAdapter', () => { { username: 'bugs' }, { caseInsensitive: true, explain: true } ); - expect(preIndexPlan.executionStats.executionStages.stage).toBe('COLLSCAN'); - expect(postIndexPlan.executionStats.executionStages.stage).toBe('FETCH'); + expect(preIndexPlan[0].executionStats.executionStages.stage).toBe('COLLSCAN'); + expect(postIndexPlan[0].executionStats.executionStages.stage).toBe('FETCH'); }); it('should delete field without index', async () => { diff --git a/spec/ParseQuery.hint.spec.js b/spec/ParseQuery.hint.spec.js index 2685137801..853889d976 100644 --- a/spec/ParseQuery.hint.spec.js +++ b/spec/ParseQuery.hint.spec.js @@ -153,7 +153,7 @@ describe_only_db('mongo')('Parse.Query hint', () => { }); let response = await request(options); let explain = response.data.results; - expect(explain.queryPlanner.winningPlan.inputStage.stage).toBe('COLLSCAN'); + expect(explain[0].queryPlanner.winningPlan.inputStage.stage).toBe('COLLSCAN'); options = Object.assign({}, masterKeyOptions, { url: Parse.serverURL + '/classes/TestObject', @@ -164,7 +164,7 @@ describe_only_db('mongo')('Parse.Query hint', () => { }); response = await request(options); explain = response.data.results; - expect(explain.queryPlanner.winningPlan.inputStage.inputStage.indexName).toBe('_id_'); + expect(explain[0].queryPlanner.winningPlan.inputStage.inputStage.indexName).toBe('_id_'); }); it_only_mongodb_version('<4.4')('query aggregate with hint (rest)', async () => { diff --git a/spec/ParseQuery.spec.js b/spec/ParseQuery.spec.js index e196280a5c..ff3aac6c9e 100644 --- a/spec/ParseQuery.spec.js +++ b/spec/ParseQuery.spec.js @@ -5214,8 +5214,8 @@ describe('Parse.Query testing', () => { const query = new Parse.Query('_User'); query.equalTo('objectId', user.id); query.explain(); - const result = await query.find(); + const results = await query.find(); // Validate - expect(result.executionStats).not.toBeUndefined(); + expect(results[0].executionStats).not.toBeUndefined(); }); }); diff --git a/src/Adapters/Storage/Mongo/MongoStorageAdapter.js b/src/Adapters/Storage/Mongo/MongoStorageAdapter.js index 2b5eaa0f09..dfac2eb8de 100644 --- a/src/Adapters/Storage/Mongo/MongoStorageAdapter.js +++ b/src/Adapters/Storage/Mongo/MongoStorageAdapter.js @@ -622,7 +622,7 @@ export class MongoStorageAdapter implements StorageAdapter { ) .then(objects => { if (explain) { - return objects; + return [objects]; } return objects.map(object => mongoObjectToParseObject(className, object, schema)); })