From 855c02447baf0e18f49e8c0c8cc6d3a9bea3bfbe Mon Sep 17 00:00:00 2001 From: arggh <17210302+arggh@users.noreply.github.com> Date: Mon, 5 Dec 2022 23:26:20 +0200 Subject: [PATCH] Streamline array operation handling --- packages/mongo/oplog_v2_converter.js | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/packages/mongo/oplog_v2_converter.js b/packages/mongo/oplog_v2_converter.js index 35f289a0f8..43c6e64411 100644 --- a/packages/mongo/oplog_v2_converter.js +++ b/packages/mongo/oplog_v2_converter.js @@ -36,7 +36,7 @@ function join(prefix, key) { return prefix ? `${prefix}.${key}` : key; } -const arrayOperatorKeyRegex = /^(a|u\d+)$/; +const arrayOperatorKeyRegex = /^(a|[su]\d+)$/; function isArrayOperatorKey(field) { return arrayOperatorKeyRegex.test(field); @@ -46,12 +46,6 @@ function isArrayOperator(operator) { return operator.a === true && Object.keys(operator).every(isArrayOperatorKey); } -const arrayUpdateRegex = /^(u\d+)$/; - -function isArrayUpdate(operator) { - return arrayUpdateRegex.test(operator); -} - function flattenObjectInto(target, source, prefix) { if (Array.isArray(source) || typeof source !== 'object' || source === null) { target[prefix] = source; @@ -91,15 +85,6 @@ function convertOplogDiff(oplogEntry, diff, prefix) { Object.entries(value).forEach(([key, value]) => { oplogEntry.$set[join(prefix, key)] = value; }); - } else if (isArrayUpdate(diffKey)) { - const positionKey = join(prefix, diffKey.slice(1)); - if (value === null) { - oplogEntry.$unset ??= {}; - oplogEntry.$unset[positionKey] = true; - } else { - oplogEntry.$set ??= {}; - oplogEntry.$set[positionKey] = value; - } } else { // Handle s-fields. const key = diffKey.slice(1); @@ -111,7 +96,9 @@ function convertOplogDiff(oplogEntry, diff, prefix) { } const positionKey = join(join(prefix, key), position.slice(1)); - if (value === null) { + if (position[0] === 's') { + convertOplogDiff(oplogEntry, value, positionKey); + } else if (value === null) { oplogEntry.$unset ??= {}; oplogEntry.$unset[positionKey] = true; } else {