📜  MongoDB – 索引类型

📅  最后修改于: 2022-05-13 01:56:58.170000             🧑  作者: Mango

MongoDB – 索引类型

数据库的美妙之处在于索引,即在短时间内获取数据而无需遍历整个数据集。 MongoDB 是一个遵循索引的 NoSQL 文档类型数据库。在文档数量有限的情况下,索引使在集合中的搜索更容易。二叉树是索引使用的数据结构。在文档中,_id 字段是 MongoDB 自动创建的默认索引,我们不允许删除该索引。如果我们尝试使用 dropIndexe() 方法删除这个索引,它会给我们一个错误。并且这个字段的值唯一地标识了一个文档和其他文档。

创建索引:

除了默认索引,我们还可以使用createIndex()方法自行创建索引。此方法在指定的集合上创建一个或多个索引。

句法 :

例子:



在以下示例中,我们正在使用:

db.students.createIndex({studentsId:1})

在下图中,首先,我们找到了集合的详细信息。因此,这里的集合名称是学生,我们要在其中创建“studentId”列的索引。

注意: MongoDB 区分大小写。因此, studentId 和 studentid 被区别对待。

在执行我们的查询时,我们得到消息“ok”,这意味着创建了一个索引,还有“numIndexesAfter”:2“一个索引已经可用(默认索引),因此计数增加了 2。

索引类型

MongoDB 提供了根据数据类型或查询使用的不同类型的索引。 MongoDB支持的索引如下:

1. 单字段索引:单字段索引是指对文档的单个字段进行索引。此索引有助于按升序和降序获取数据。

句法:



这里 1 表示按升序指定字段,-1 表示按降序指定。

例子:

db.students.createIndex({studentsId:1})

在此示例中,我们将在 StudentsId 字段上创建单个索引,并且该字段按升序指定。

2.复合索引:我们可以组合多个字段进行复合索引,这将有助于以这种方式搜索或过滤文档。或者换句话说,复合索引是一种索引,其中单个索引结构包含多个引用。

句法:

在这里,我们可以组合此模式中的必填字段。此外,这些字段的值为 1(升序)或 -1(降序)。

注意:复合索引可能只有一个散列索引字段,但散列索引需要一个散列函数来计算索引字段值的散列。



例子:

在这里,我们在 studentAge: 1, studentName:1 上创建一个复合索引

db.students.createIndex({studentAge: 1, studentName:1})

db.students.find().sort({"studentAge":1,"studentName":1}).pretty()

在这里,我们采用基于“studentAge”和“studentName”字段的排序功能,因此在下图中,尽管有 2 个文档匹配“studentAge = 25”,因为 studentName 是一个附加值,作为第二个文档,显示值为“Geek40”的 studentName ,之后仅显示值为“GeeksForGeeksbest”的 studentName 作为第三个文档。因此,当我们想要更紧密的过滤级别时,有时需要创建复合索引。

3.多键索引 MongoDB 使用多键索引来索引存储在数组中的值。当我们索引一个包含数组值的字段时,MongoDB 会自动为该数组中存在的每个值创建一个单独的索引。使用这些多键索引,我们可以通过匹配项轻松找到包含数组的文档。在 MongoDB 中,您不需要显式指定多键索引,因为如果索引字段包含数组值,MongoDB 会自动确定是否创建多键索引。

句法:

此处,该字段的值为 1(升序)或 -1(降序)。

例子:



在学生集合中,我们有三个包含数组字段的文档。

现在我们创建一个多键索引:

db.students.createIndex({skillsets:1})

现在我们查看包含技能集的文档:[“Java”,“Android”]

db.students.find({skillsets:["Java", "Android"]}).pretty()

4.地理空间索引:它是MongoDB的一个重要特性。 MongoDB 提供了两个地理空间索引,称为 2d 索引和 2d 球体索引,使用这些索引我们可以查询地理空间数据。在这里,二维索引支持用于查找存储在二维平面中的数据的查询。它仅支持存储在旧坐标对中的数据。而二维球体索引支持用于查找存储在球面几何中的数据的查询。它支持存储在旧坐标对中的数据以及 GeoJSON 对象。它还支持查询,如包含、交叉和接近等查询。

二维球体索引的语法:

例子:

让我们假设“行业”的可用数据

现在,让我们在 location 字段上创建一个 2d 球体索引:

db.industries.createIndex({location:"2dsphere"})

现在,在执行以下查询时,我们得到

db.industries.find(
{
    location:
        {$near:
            {
                $geometry:{type: "Point", coordinates:[-73.9667, 40.78]},
                $minDistance:1000,
                $maxDistance: 5000
            }
        }
    }
}.pretty()

这里, “$near”运算符返回指定范围内的文档,这些文档距离指定的 GeoJSON 点至少 1000 米,最多 5000 米,因此我们只获得潮汐公园输出。与 $near 类似,它可以支持 $nearSphere、$geoWithin、$geoIntersects、$geoNear 等,

5. 文本索引: MongoDB 支持对字符串内容进行文本搜索的查询操作。文本索引允许我们在指定集合中查找字符串内容。它可以包括任何包含字符串内容或字符串项数组的字段。一个集合最多可以包含一个文本索引。您可以在复合索引中使用文本索引。

句法:

我们也可以通过将搜索词括在双引号中来给出精确的短语以进行搜索

此处用双引号括起来,搜索结果仅包含精确的搜索数据。

如果我们想在搜索词中排除一些文本,那么我们可以这样做

前置一个 –字符会使搜索文本被忽略并考虑其余文本。

在文本搜索中,结果以未排序的顺序提供。为了使其按相关性分数的排序顺序可用,需要 $meta textScore 字段并对其进行排序。例子:

db.singers.find(
  { $text: { $search: "Annisten" } },
  { score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } )

例子:

在附件集合中,我们创建文本索引:

db.accessories.createIndex({name: "text", description: "text"})

现在我们显示那些包含字符串“Input”的文档:

db.accessories.find({$text:{$search: "Input"}})

6. 哈希索引: 维护带有索引字段值的散列的条目(所有集合中主要是 _id 字段),我们使用散列索引。这种索引主要用于通过分片实现数据的均匀分布。散列键有助于跨分片集群对数据进行分区。

句法:

从 4.4 版本开始,复合哈希索引适用

7. 通配符索引: MongoDB 支持在一个字段或一组字段上创建索引,如果提到该组字段,则称为通配符索引。通常,通配符索引不包含 _id 字段,但是如果您要在通配符索引中包含 _id 字段,则必须明确定义它。 MongoDB 允许您在给定集合中创建多个通配符索引。通配符索引支持对未知或任意字段的查询。

句法:

在指定字段上创建通配符索引:

要在所有字段上创建通配符索引:

在多个指定字段上创建通配符索引:

例子:

在图书收藏中,我们创建通配符索引:

让我们为“authorTags”字段创建一个索引

db.book.createIndex( { "authorTags.$**" : 1 } )

由于“索引”是在一组字段上创建的,我们可以通过以下方式轻松查询

db.book.find( { "authorTags.inclusions" : "RDBMS" } )
db.book.find( { "authorTags.usedin" : "Multipurpose" } )