summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuoxin Xu <ruoxin.xu@mongodb.com>2023-02-08 11:17:45 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2023-02-08 12:21:54 +0000
commit7172ed3a9ce349bb02c5f56c8c583d33944852b8 (patch)
tree99c3097878437320fbf5915d24359ff45117553c
parent709346fbd32a726d1a13fde1f2246fc3932652fb (diff)
downloadmongo-7172ed3a9ce349bb02c5f56c8c583d33944852b8.tar.gz
SERVER-72463 Use MinKey in multikey path index keys generated for compound wildcard indexes
-rw-r--r--src/mongo/db/index/wildcard_key_generator.cpp12
-rw-r--r--src/mongo/db/index/wildcard_key_generator_test.cpp20
2 files changed, 21 insertions, 11 deletions
diff --git a/src/mongo/db/index/wildcard_key_generator.cpp b/src/mongo/db/index/wildcard_key_generator.cpp
index 3d963c2946e..4958ed0d5f7 100644
--- a/src/mongo/db/index/wildcard_key_generator.cpp
+++ b/src/mongo/db/index/wildcard_key_generator.cpp
@@ -79,6 +79,14 @@ void appendToKeyString(const std::vector<BSONElement>& elems,
}
}
+// Append 'MinKey' to 'keyString'. Multikey path keys use 'MinKey' for non-wildcard fields.
+void appendToMultiKeyString(const std::vector<BSONElement>& elems,
+ KeyString::PooledBuilder* keyString) {
+ for (size_t i = 0; i < elems.size(); i++) {
+ keyString->appendBSONElement(kMinBSONKey.firstElement());
+ }
+}
+
// We should make a new Ordering for wildcard key generator because the index keys generated for
// wildcard indexes include a "$_path" field prior to the wildcard field and the Ordering passed in
// does not account for the "$_path" field.
@@ -226,13 +234,13 @@ void SingleDocumentKeyEncoder::_addMultiKey(const FieldRef& fullPath) {
KeyString::PooledBuilder keyString(_pooledBufferBuilder, _keyStringVersion, _ordering);
if (!_preElems.empty()) {
- appendToKeyString(_preElems, _collator, &keyString);
+ appendToMultiKeyString(_preElems, &keyString);
}
for (auto elem : BSON("" << 1 << "" << fullPath.dottedField())) {
keyString.appendBSONElement(elem);
}
if (!_postElems.empty()) {
- appendToKeyString(_postElems, _collator, &keyString);
+ appendToMultiKeyString(_postElems, &keyString);
}
keyString.appendRecordId(record_id_helpers::reservedIdFor(
diff --git a/src/mongo/db/index/wildcard_key_generator_test.cpp b/src/mongo/db/index/wildcard_key_generator_test.cpp
index 107a6e62525..ed6407eabe2 100644
--- a/src/mongo/db/index/wildcard_key_generator_test.cpp
+++ b/src/mongo/db/index/wildcard_key_generator_test.cpp
@@ -1387,21 +1387,23 @@ TEST_F(WildcardKeyGeneratorCompoundTest, CompoundWildcardIndexShouldBeSparse) {
}
TEST_F(WildcardKeyGeneratorCompoundTest, CanGenerateKeysForMultikeyFieldCompound) {
- WildcardKeyGenerator keyGen{fromjson("{'$**': 1, c: 1}"),
- fromjson("{c: 0}"),
+ WildcardKeyGenerator keyGen{fromjson("{a: 1, '$**': 1, c: 1}"),
+ fromjson("{a: 0, c: 0}"),
nullptr,
KeyString::Version::kLatestVersion,
Ordering::make(BSONObj()),
rsKeyFormat};
- auto inputDoc = fromjson("{a: [], b: [1, {c: [3]}]}");
+ auto inputDoc = fromjson("{a: 1, b: [1, {c: [3]}]}");
- auto expectedKeys = makeKeySet({fromjson("{'': 'a', '': undefined, '': null}"),
- fromjson("{'': 'b', '': 1, '': null}"),
- fromjson("{'': 'b.c', '': 3, '': null}")});
+ auto expectedKeys = makeKeySet({fromjson("{'': 1, '': 'b', '': 1, '': null}"),
+ fromjson("{'': 1, '': 'b.c', '': 3, '': null}")});
auto expectedMultikeyPaths =
- makeKeySet({fromjson("{'': 1, '': 'a', '': null}"),
- fromjson("{'': 1, '': 'b', '': null}"),
- fromjson("{'': 1, '': 'b.c', '': null}")},
+ makeKeySet({BSON("" << MINKEY << "" << 1 << ""
+ << "b"
+ << "" << MINKEY),
+ BSON("" << MINKEY << "" << 1 << ""
+ << "b.c"
+ << "" << MINKEY)},
record_id_helpers::reservedIdFor(
record_id_helpers::ReservationId::kWildcardMultikeyMetadataId, rsKeyFormat));