mongodb 权威指南 索引
索引
这个有时间在细看
索引使你能够高效地执行查询。它们是应用程序开发的重要组成部分,甚至对于某些类型的查询是必需的
不使用索引的查询称为集合扫描,这意味着服务器端必须“浏览整本书”才能得到查询的结果
创建索引
现在尝试在 "username" 字段上创建一个索引。要创建索引,需要使用 createIndex 集合方法:

使用索引是有代价的:修改索引字段的写操作(插入、更新和删除)会花费更长的时间
![]()
这称为复合索引(compound index)。如果查询中有多个排序方向或者查询条件中有多个键,那么这个索引会非常有用。复合索引是创建在多个字段上的索引
在设计复合索引时
等值过滤的键应该在最前面;
用于排序的键应该在多值字段之前;
多值过滤的键应该在最后面。
在设计复合索引时遵循这些准则,然后在实际的工作负载下进行测试,这样就可以确定索引所支持的查询模式都有哪些了
索引对象和数组
MongoDB 允许深入文档内部,对内嵌字段和数组创建索引。内嵌对象和数组字段可以和顶级字段一起在复合索引中使用。尽管在某些方面比较特别,但是它们的大多数行为与“普通”索引字段是一致的
索引内嵌文档
可以在内嵌文档的键上创建索引,方法与在普通键上创建索引相同。如果有一个集合,其中每个文档表示一个用户,那么可能会有一个描述每个用户位置的内嵌文档:

可以在 "loc" 的其中一个子字段(如 "loc.city")上创建索引,以提高这个字段的查询速度:

索引数组
![]()
也可以对数组创建索引,这样就能高效地查找特定的数组元素了。假设有一个博客文章集合,其中每个文档是一篇文章。每篇文章都有一个 "comments" 字段,这是一个由 "comment" 子文档组成的数组。如果想找出最近被评论次数最多的博客文章,可以在博客文章集合中内嵌的 "comments" 数组的 "date" 键上创建索引:
对数组创建索引实际上就是对数组的每一个元素创建一个索引项,所以如果一篇文章有 20 条评论,那么它就会有 20 个索引项。这使得数组索引的代价比单值索引要高:对于单次的插入、更新或删除,每一个数组项可能都需要更新(也许会有上千个索引项)。
与前面 "loc" 的例子不同,整个数组是无法作为一个实体创建索引的:对数组创建索引就是对数组中的每个元素创建索引,而不是对数组本身创建索引。数组元素上的索引并不包含任何位置信息:要查找特定位置的数组元素(如 "comments.4"),查询是无法使用索引的
查询索引
创建索引
db.legislation_event.createIndex({"system_date": 1})
db.legislation_event.createIndex({"target_enactment_norm_citation": 1})
db.legislation_event.createIndex({"subtask_id": 1})
db.legislation_event.createIndex({"event_type": 1})
db.legislation_event.createIndex({"id": 1})
db.legislation_event.createIndex({"citation": 1})
db.legislation_event.createIndex({"uid": 1})
db.legislation_event.createIndex({"content_type": 1})
查询索引
db.legislation_event.getIndexes()

浙公网安备 33010602011771号