- MongoDB 教程
- MongoDB - 主页
- MongoDB - 概述
- MongoDB - 优点
- MongoDB - 环境
- MongoDB - 数据建模
- MongoDB - 创建数据库
- MongoDB - 删除数据库
- MongoDB - 创建集合
- MongoDB - 删除集合
- MongoDB - 数据类型
- MongoDB - 插入文档
- MongoDB - 查询文档
- MongoDB - 更新文档
- MongoDB - 删除文档
- MongoDB - 投影
- MongoDB - 限制记录
- MongoDB - 记录排序
- MongoDB - 索引
- MongoDB - 聚合
- MongoDB - 复制
- MongoDB - 分片
- MongoDB - 创建备份
- MongoDB - 部署
- MongoDB-Java
- MongoDB-PHP
- 高级 MongoDB
- MongoDB - 关系
- MongoDB - 数据库参考
- MongoDB - 涵盖查询
- MongoDB - 分析查询
- MongoDB - 原子操作
- MongoDB - 高级索引
- MongoDB - 索引限制
- MongoDB - 对象 ID
- MongoDB - 映射减少
- MongoDB - 文本搜索
- MongoDB - 正则表达式
- 与 Rockmongo 合作
- MongoDB-GridFS
- MongoDB - 上限集合
- 自动递增序列
- MongoDB 有用资源
- MongoDB - 问题与解答
- MongoDB - 快速指南
- MongoDB - 有用的资源
- MongoDB - 讨论
MongoDB - 高级索引
我们已在名为 users 的集合中插入以下文档,如下所示 -
db.users.insert( { "address": { "city": "Los Angeles", "state": "California", "pincode": "123" }, "tags": [ "music", "cricket", "blogs" ], "name": "Tom Benzamin" } )
上面的文档包含一个地址子文档和一个标签数组。
索引数组字段
假设我们要根据用户的标签来搜索用户文档。为此,我们将在集合中的标签数组上创建一个索引。
在数组上创建索引又会为其每个字段创建单独的索引条目。因此,在我们的例子中,当我们在标签数组上创建索引时,将为它的值音乐、板球和博客创建单独的索引。
要在标签数组上创建索引,请使用以下代码 -
>db.users.createIndex({"tags":1}) { "createdCollectionAutomatically" : false, "numIndexesBefore" : 2, "numIndexesAfter" : 3, "ok" : 1 } >
创建索引后,我们可以像这样搜索集合的标签字段 -
> db.users.find({tags:"cricket"}).pretty() { "_id" : ObjectId("5dd7c927f1dd4583e7103fdf"), "address" : { "city" : "Los Angeles", "state" : "California", "pincode" : "123" }, "tags" : [ "music", "cricket", "blogs" ], "name" : "Tom Benzamin" } >
要验证是否使用了正确的索引,请使用以下解释命令 -
>db.users.find({tags:"cricket"}).explain()
这会给你以下结果 -
{ "queryPlanner" : { "plannerVersion" : 1, "namespace" : "mydb.users", "indexFilterSet" : false, "parsedQuery" : { "tags" : { "$eq" : "cricket" } }, "queryHash" : "9D3B61A7", "planCacheKey" : "04C9997B", "winningPlan" : { "stage" : "FETCH", "inputStage" : { "stage" : "IXSCAN", "keyPattern" : { "tags" : 1 }, "indexName" : "tags_1", "isMultiKey" : false, "multiKeyPaths" : { "tags" : [ ] }, "isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : { "tags" : [ "[\"cricket\", \"cricket\"]" ] } } }, "rejectedPlans" : [ ] }, "serverInfo" : { "host" : "Krishna", "port" : 27017, "version" : "4.2.1", "gitVersion" : "edf6d45851c0b9ee15548f0f847df141764a317e" }, "ok" : 1 } >
上面的命令产生“cursor”:“BtreeCursortags_1”,这确认使用了正确的索引。
索引子文档字段
假设我们要根据城市、州和 pincode 字段搜索文档。由于所有这些字段都是地址子文档字段的一部分,因此我们将在子文档的所有字段上创建索引。
要在子文档的所有三个字段上创建索引,请使用以下代码 -
>db.users.createIndex({"address.city":1,"address.state":1,"address.pincode":1}) { "numIndexesBefore" : 4, "numIndexesAfter" : 4, "note" : "all indexes already exist", "ok" : 1 } >
创建索引后,我们可以利用该索引搜索任何子文档字段,如下所示 -
> db.users.find({"address.city":"Los Angeles"}).pretty() { "_id" : ObjectId("5dd7c927f1dd4583e7103fdf"), "address" : { "city" : "Los Angeles", "state" : "California", "pincode" : "123" }, "tags" : [ "music", "cricket", "blogs" ], "name" : "Tom Benzamin" }
请记住,查询表达式必须遵循指定索引的顺序。因此上面创建的索引将支持以下查询 -
>db.users.find({"address.city":"Los Angeles","address.state":"California"}).pretty() { "_id" : ObjectId("5dd7c927f1dd4583e7103fdf"), "address" : { "city" : "Los Angeles", "state" : "California", "pincode" : "123" }, "tags" : [ "music", "cricket", "blogs" ], "name" : "Tom Benzamin" } >