summaryrefslogtreecommitdiff
path: root/src/mongo/db/timeseries/timeseries_update_delete_util.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/timeseries/timeseries_update_delete_util.cpp')
-rw-r--r--src/mongo/db/timeseries/timeseries_update_delete_util.cpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/mongo/db/timeseries/timeseries_update_delete_util.cpp b/src/mongo/db/timeseries/timeseries_update_delete_util.cpp
index 5eafea0d762..f38a5681e19 100644
--- a/src/mongo/db/timeseries/timeseries_update_delete_util.cpp
+++ b/src/mongo/db/timeseries/timeseries_update_delete_util.cpp
@@ -31,6 +31,7 @@
#include "mongo/db/pipeline/expression_context.h"
#include "mongo/db/pipeline/pipeline.h"
+#include "mongo/db/timeseries/timeseries_constants.h"
namespace mongo::timeseries {
namespace {
@@ -259,4 +260,39 @@ write_ops::UpdateOpEntry translateUpdate(const BSONObj& translatedQuery,
}
MONGO_UNREACHABLE;
}
+
+void replaceTimeseriesQueryMetaFieldName(mutablebson::Element elem,
+ const StringData& metaField,
+ bool shouldReplaceFieldValue) {
+ if (metaField.empty()) {
+ return;
+ }
+ shouldReplaceFieldValue = (elem.getFieldName() != "$literal") &&
+ (shouldReplaceFieldValue || (elem.getFieldName() == "$expr"));
+ if (isMetaFieldFirstElementOfDottedPathField(elem.getFieldName(), metaField)) {
+ size_t dotIndex = elem.getFieldName().find('.');
+ dotIndex >= elem.getFieldName().size()
+ ? invariantStatusOK(elem.rename("meta"))
+ : invariantStatusOK(elem.rename(
+ "meta" +
+ elem.getFieldName().substr(dotIndex, elem.getFieldName().size() - dotIndex)));
+ }
+ // Substitute element fieldValue with "$meta" if element is a subField of $expr, not a subField
+ // of $literal, and the element fieldValue is "$" + the metaField.
+ else if (shouldReplaceFieldValue && elem.isType(BSONType::String) &&
+ isMetaFieldFirstElementOfDottedPathField(elem.getValueString(), "$" + metaField)) {
+ size_t dotIndex = elem.getValueString().find('.');
+ dotIndex >= elem.getValueString().size()
+ ? invariantStatusOK(elem.setValueString("$meta"))
+ : invariantStatusOK(elem.setValueString(
+ "$meta" +
+ elem.getValueString().substr(dotIndex, elem.getValueString().size() - dotIndex)));
+ }
+ if (elem.hasChildren()) {
+ for (size_t i = 0; i < elem.countChildren(); ++i) {
+ replaceTimeseriesQueryMetaFieldName(
+ elem.findNthChild(i), metaField, shouldReplaceFieldValue);
+ }
+ }
+}
} // namespace mongo::timeseries