如何在MongoDB中创建具有特定名称的索引
当你在MongoDB中创建索引时,如果你没有为它指定一个名称,MongoDB将分配一个。
默认名称由与该字段的键值连接的每个索引字段名称组成。例如,排序顺序,或者如果是文本索引、字符串,或者如果是 2dsphere 索引、字符串等。_text``_2dsphere
但是您可以在MongoDB中创建索引时分配自己的名称。
默认名称
假设我们创建一个这样的索引:
db.employees.createIndex(
{
name: 1,
salary: -1 }
)
我们没有指定名称,因此MongoDB将根据索引规范自动生成一个名称。
我们用来验证这一点:[getIndexes()](https://database.guide/get-a-list-of-indexes-in-mongodb/ "Get a List of Indexes in MongoDB")
db.employees.getIndexes()
结果:
[ { “v” : 2, “key” : { “id” : 1 }, “name” : “id” }, { “v” : 2, “key” : { “name” : 1, “salary” : -1 }, “name” : “name_1_salary-1” } ]
这里有两个索引。第一个是使用集合自动创建的默认索引。第二个是我们刚刚创建的那个。_id
在本例中,MongoDB 为索引命名为 .name_1_salary_-1
如果我们需要删除此索引,则需要记住它的名称或定义。鉴于默认名称基于定义,如果您有更复杂的定义,它可能会变得有点笨拙。
无论如何,我们可以像这样删除上面的索引:
db.employees.dropIndex("name_1_salary_-1")
指定名称
如果我们想为索引创建自己的名称,我们可以像这样创建它:
db.employees.createIndex(
{
name: 1,
salary: -1
},
{
name: "employee_salary"
}
)
我们所做的只是在可选文档中添加一个字段,用于为索引提供选项。name
如果我们现在检查索引,我们可以看到它具有我们提供的名称:
db.employees.getIndexes()
结果:
[ { “v” : 2, “key” : { “_id” : 1 }, “name” : “id” }, { “v” : 2, “key” : { “name” : 1, “salary” : -1 }, “name” : “employee_salary” } ]
包括名称与其他选项
在前面的示例中,字段是我们在创建索引时提供的唯一选项。名称不是可以为索引指定的唯一选项。name
您还可以提供其他选项,例如默认语言、语言覆盖等。任何其他选项都需要括在同一文档中,用逗号分隔。
下面是使用其他两个选项(但不指定名称)创建索引的示例:
db.sitcoms.createIndex(
{
"original_name": "text",
"translations.sitcom_name": "text"
},
{
"default_language": "danish",
"language_override": "sprog"
}
)
这是与前一个集合不同的集合上的索引。但是你可以看到我们已经指定了我们自己的值和 a 值。它也是一个复合索引(它是一个包含多个字段的索引)。default_language``language_override
我没有指定名称,因此我们可以看到使用这样的索引时名称会变长:
db.employees.getIndexes()
结果:
[ { “v” : 2, “key” : { “_id” : 1 }, “name” : “id” }, { “v” : 2, “key” : { “_fts” : “text”, “_ftsx” : 1 }, “name” : “original_name_text_translations.sitcom_name_text”, “default_language” : “danish”, “language_override” : “sprog”, “weights” : { “original_name” : 1, “translations.sitcom_name” : 1 }, “textIndexVersion” : 3 } ]
所以在这种情况下,MongoDB给索引一个默认名称,因为它是从我们的索引定义派生出来的。original_name_text_translations.sitcom_name_text
我们需要使用以下代码按名称删除此索引:
db.sitcoms.dropIndex("original_name_text_translations.sitcom_name_text")
要将名称包含在此类索引中,我们可以在用于指定默认语言和语言覆盖的同一文档中提供它。
因此,我们可以像这样创建索引:
db.sitcoms.createIndex(
{
"original_name": "text",
"translations.sitcom_name": "text"
},
{
"default_language": "danish",
"language_override": "sprog",
"name": "sitcoms_da"
}
)
在本例中,我们使用索引名称。sitcoms_da
现在,当我们获得索引列表时,我们可以看到指定的名称:
db.sitcoms.getIndexes()
结果:
[ { “v” : 2, “key” : { “_id” : 1 }, “name” : “id” }, { “v” : 2, “key” : { “_fts” : “text”, “_ftsx” : 1 }, “name” : “sitcoms_da”, “default_language” : “danish”, “language_override” : “sprog”, “weights” : { “original_name” : 1, “translations.sitcom_name” : 1 }, “textIndexVersion” : 3 } ]