MongoDB 简明教程

MongoDB 索引与搜索

1. 索引 (Indexes)

索引是支持在 MongoDB 中高效执行查询的特殊数据结构。如果没有索引,MongoDB 必须执行全表扫描(Collection Scan),即扫描集合中的每一个文档,以找到与查询语句匹配的文档。这种扫描效率极低,尤其是在处理大数据集时。

索引存储了特定字段或一组字段的值,并按照值的大小进行排序。通过存储排序后的数据,索引能够支持高效的等值匹配和范围查询操作。

2. 创建索引

你可以使用 createIndex() 方法在集合上创建索引。该方法接受一个文档作为参数,该文档指定了要建立索引的字段以及索引的类型(升序用 1,降序用 -1)。

示例

movies 集合的 title 字段上创建一个升序索引:

db.movies.createIndex({ title: 1 })

3. 查看索引列表

若要查看集合中已经存在的所有索引,你可以使用 getIndexes() 方法。

示例

db.movies.getIndexes()

执行后,你将看到一个包含索引详细信息(如名称、版本和键值对)的数组。

4. 删除索引

如果你不再需要某个索引,可以使用 dropIndex() 方法将其删除。你需要提供索引的名称或定义该索引的规范文档。

示例

删除 title 字段上的索引:

db.movies.dropIndex("title_1")

5. Atlas Search (Atlas 搜索)

MongoDB Atlas Search 提供了一种在 MongoDB Atlas 上构建的高性能全文本搜索能力。它基于 Apache Lucene 引擎,支持模糊匹配、自动补全、同义词搜索以及更复杂的搜索功能。

与标准索引不同,Atlas Search 索引是针对搜索用例进行优化的。

5.1 创建 Atlas Search 索引

在 MongoDB Atlas 控制面板中,你可以导航至“Search”选项卡来创建搜索索引。你可以选择“Visual Editor”或“JSON Editor”来定义你的搜索配置,例如指定分析器(Analyzers)和字段映射。

5.2 使用 $search 阶段

一旦创建了 Search 索引,你就可以在聚合管道中使用 $search 阶段来执行复杂的搜索查询。

示例

db.movies.aggregate([
  {
    $search: {
      index: "default",
      text: {
        query: "Star Wars",
        path: "title"
      }
    }
  }
])

这个查询会利用 Lucene 引擎在 title 字段中搜索包含 "Star Wars" 的电影,即使存在轻微的拼写差异或不同的分词形式也能获得精准结果。