From b23c22de234f2c9997b3b02bd819a964beb742cf Mon Sep 17 00:00:00 2001 From: Renan Castro Date: Fri, 4 Feb 2022 08:07:31 -0300 Subject: [PATCH 1/3] Fix flatten object issue when the object is empty on oplog converter - fix #11884 --- packages/mongo/oplog_v2_converter.js | 2 +- packages/mongo/oplog_v2_converter_tests.js | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/mongo/oplog_v2_converter.js b/packages/mongo/oplog_v2_converter.js index 658e64ed0a..c7576087c5 100644 --- a/packages/mongo/oplog_v2_converter.js +++ b/packages/mongo/oplog_v2_converter.js @@ -57,7 +57,6 @@ const nestedOplogEntryParsers = ( const setObjectSource = { ...i, ...u }; const $set = Object.keys(setObjectSource).reduce((acc, key) => { const prefixedKey = `${prefixKey}${key}`; - return { ...acc, ...(!Array.isArray(setObjectSource[key]) && typeof setObjectSource[key] === 'object' @@ -97,6 +96,7 @@ function flattenObject(ob) { if (typeof ob[i] == 'object' && ob[i] !== null) { const flatObject = flattenObject(ob[i]); + if(Object.keys(flatObject).length === 0) { return ob; } for (const x in flatObject) { if (!flatObject.hasOwnProperty(x)) continue; diff --git a/packages/mongo/oplog_v2_converter_tests.js b/packages/mongo/oplog_v2_converter_tests.js index 6c8e73063f..ba2016de7b 100644 --- a/packages/mongo/oplog_v2_converter_tests.js +++ b/packages/mongo/oplog_v2_converter_tests.js @@ -1,6 +1,6 @@ import { oplogV2V1Converter } from './oplog_v2_converter'; -Tinytest.add('oplog - v2/v1 conversion', function(test) { +Tinytest.only('oplog - v2/v1 conversion', function(test) { const entry1 = { $v: 2, diff: { scustom: { sEJSON$value: { u: { EJSONtail: 'd' } } } }, @@ -50,6 +50,16 @@ Tinytest.add('oplog - v2/v1 conversion', function(test) { JSON.stringify({ $v: 2, $set: { 'a.b': 2 } }) ); + //set a new nested field inside an object + const entry51 = { "$v" : 2, "diff" : { "u" : { "count" : 1 }, "i" : { "nested" : { "state" : { } } } } }; + // the correct format for this test, inspecting the mongodb oplog, should be "nested" : { "state" : { } } } + // but this is not a case in which we cant flatten the object without collateral, so we are considering + // "nested.state" : { } to be valid too + test.equal( + JSON.stringify(oplogV2V1Converter(entry51)), + JSON.stringify( { "$v" : 2, "$set" : { "nested.state": { }, "count" : 1 } }) + ); + //set an existing nested field inside an object const entry6 = { $v: 2, From 2b0485ce739fa50cecb674da404d4fcbfea3f136 Mon Sep 17 00:00:00 2001 From: Renan Castro Date: Fri, 4 Feb 2022 08:50:44 -0300 Subject: [PATCH 2/3] Remove only from oplog tests --- packages/mongo/oplog_v2_converter_tests.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mongo/oplog_v2_converter_tests.js b/packages/mongo/oplog_v2_converter_tests.js index ba2016de7b..273c25b12d 100644 --- a/packages/mongo/oplog_v2_converter_tests.js +++ b/packages/mongo/oplog_v2_converter_tests.js @@ -1,6 +1,6 @@ import { oplogV2V1Converter } from './oplog_v2_converter'; -Tinytest.only('oplog - v2/v1 conversion', function(test) { +Tinytest.add('oplog - v2/v1 conversion', function(test) { const entry1 = { $v: 2, diff: { scustom: { sEJSON$value: { u: { EJSONtail: 'd' } } } }, From 832efd1baadf19d0e1015e70a956ed24b4b1fbce Mon Sep 17 00:00:00 2001 From: Renan Castro Date: Fri, 4 Feb 2022 08:55:21 -0300 Subject: [PATCH 3/3] Fix comment phrasing on oplog converter --- packages/mongo/oplog_v2_converter_tests.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mongo/oplog_v2_converter_tests.js b/packages/mongo/oplog_v2_converter_tests.js index 273c25b12d..602e82cb6f 100644 --- a/packages/mongo/oplog_v2_converter_tests.js +++ b/packages/mongo/oplog_v2_converter_tests.js @@ -53,7 +53,7 @@ Tinytest.add('oplog - v2/v1 conversion', function(test) { //set a new nested field inside an object const entry51 = { "$v" : 2, "diff" : { "u" : { "count" : 1 }, "i" : { "nested" : { "state" : { } } } } }; // the correct format for this test, inspecting the mongodb oplog, should be "nested" : { "state" : { } } } - // but this is not a case in which we cant flatten the object without collateral, so we are considering + // but this is a case in which we can flatten the object without collateral, so we are considering // "nested.state" : { } to be valid too test.equal( JSON.stringify(oplogV2V1Converter(entry51)),