diff options
author | Ruoxin Xu <ruoxin.xu@mongodb.com> | 2023-02-08 11:17:45 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2023-02-08 12:21:54 +0000 |
commit | 7172ed3a9ce349bb02c5f56c8c583d33944852b8 (patch) | |
tree | 99c3097878437320fbf5915d24359ff45117553c | |
parent | 709346fbd32a726d1a13fde1f2246fc3932652fb (diff) | |
download | mongo-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.cpp | 12 | ||||
-rw-r--r-- | src/mongo/db/index/wildcard_key_generator_test.cpp | 20 |
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)); |