MongoDB: Как я могу изменить тип движка (с B-Tree на LSM-Tree) индекса _id_?
Мы можем создать коллекцию с помощью движка WiredTiger и type=lsm
, но эта функция не упоминается в документах MongoDB:
db.createCollection(
"test",
{ storageEngine: { wiredTiger: {configString: "type=lsm"}}}
)
После вставки нескольких документов и добавления индекса WiredTiger действительно создает файлы LSM.
db.test.insert([
{ value: 1},
{ value: 2},
{ value: 3}
]) // Done in 16:04
db.test.createIndex(
{ value: 1 },
{ storageEngine: { wiredTiger: {configString: "type=lsm"}}}
) // Done in 19:59
$ ls -ltr
...
-rw-r--r--. 1 mongod mongod 16384 Jan 15 16:04 collection-0-1708338433081558809-000002.lsm
-rw-r--r--. 1 mongod mongod 16384 Jan 15 16:04 index-1-1708338433081558809.wt
-rw-r--r--. 1 mongod mongod 16384 Jan 15 19:59 index-3-1708338433081558809-000002.lsm
Коллекция и индекс value_1
похоже на LSM-Tree, но индекс _id_
все еще похоже на B-Tree.
Как я могу изменить тип индекса двигателя _id
?
1 ответ
Не тот ответ, который вы хотели бы услышать, но в настоящее время это невозможно.
_id - это особый индекс. С https://github.com/mongodb/mongo/blob/73b456d5c059b17d1c7f0f8badb7c72391ee2173/src/mongo/db/catalog/index_key_validate.cpp:
Валидатор спецификаций для всех индексов:
static std::set<StringData> allowedFieldNames = {
IndexDescriptor::k2dIndexBitsFieldName,
IndexDescriptor::k2dIndexMaxFieldName,
IndexDescriptor::k2dIndexMinFieldName,
IndexDescriptor::k2dsphereCoarsestIndexedLevel,
IndexDescriptor::k2dsphereFinestIndexedLevel,
IndexDescriptor::k2dsphereVersionFieldName,
IndexDescriptor::kBackgroundFieldName,
IndexDescriptor::kCollationFieldName,
IndexDescriptor::kDefaultLanguageFieldName,
IndexDescriptor::kDropDuplicatesFieldName,
IndexDescriptor::kExpireAfterSecondsFieldName,
IndexDescriptor::kGeoHaystackBucketSize,
IndexDescriptor::kIndexNameFieldName,
IndexDescriptor::kIndexVersionFieldName,
IndexDescriptor::kKeyPatternFieldName,
IndexDescriptor::kLanguageOverrideFieldName,
IndexDescriptor::kNamespaceFieldName,
IndexDescriptor::kPartialFilterExprFieldName,
IndexDescriptor::kPathProjectionFieldName,
IndexDescriptor::kSparseFieldName,
IndexDescriptor::kStorageEngineFieldName,
IndexDescriptor::kTextVersionFieldName,
IndexDescriptor::kUniqueFieldName,
IndexDescriptor::kWeightsFieldName,
// Index creation under legacy writeMode can result in an index spec with an _id field.
"_id"};
Спецификация разрешена для индекса _id:
static const std::set<StringData> allowedIdIndexFieldNames = {
IndexDescriptor::kCollationFieldName,
IndexDescriptor::kIndexNameFieldName,
IndexDescriptor::kIndexVersionFieldName,
IndexDescriptor::kKeyPatternFieldName,
IndexDescriptor::kNamespaceFieldName,
// Index creation under legacy writeMode can result in an index spec with an _id field.
"_id"};
Как видите, у вас есть возможность изменить ничего, кроме имени, сопоставления, версии и т. Д. kStorageEngineFieldName
там.