MongoDB数据库----高级查询

目录

一、MongoDB索引限制

1、额外开销

2、内存使用

3、查询限制

4、最大范围

二、MongoDB索引

1、ensureIndex()方法

三、MongoDB高级索引

1、索引数组字段

2、索引子文档字段


一、MongoDB索引限制

1、额外开销

每个索引占据一定的存储空间,在进行插入,更新和删除操作时也需要对索引进行操作。所以,如果你很少对集合进行读取操作,建议不使用索引。

2、内存使用

由于索引是存储在内存(RAM)中,你应该确保该索引的大小不超过内存的限制。

如果索引的大小大于内存的限制,MongoDB会删除一些索引,这将导致性能下降。

3、查询限制

索引不能被以下的查询使用:

        正则表达式及非操作符,如$nin,$not等。

        算术运算符,如$mod,等

        $where子句

所以,检测你的语句是否使用索引是一个好的习惯,可以用explain来查看。

从2.6开始,如果现有的索引字段的值超过索引建的限制,MongoDB中不会创建索引。

如果文档的索引字段值超过了索引建的限制,MongoDB不会将任何文档转换成索引的集合。

4、最大范围

集合中索引不能超过64个

索引名的长度不能超过125个字符

一个复合索引最多可以有31个字段

二、MongoDB索引

1、ensureIndex()方法

语法格式:

>db.COLLECTION_NAME.ensureIndex({KEY:1})  

语法中 Key 值为你要创建的索引字段,1为指定按升序创建索引,如果你想按降序来创建索引指定为-1即可。

实例:

>db.col.ensureIndex({"title":1})  >
ensureIndex() 方法中你也可以设置使用多个字段创建索引(关系型数据库中称作复合索引)。 
>db.col.ensureIndex({"title":1,"description":-1})  >  

ensureIndex() 接收可选参数,可选参数列表如下:

ParameterTypeDescription
backgroundBoolean建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 "background" 可选参数。 "background" 默认值为false
uniqueBoolean建立的索引是否唯一。指定为true创建唯一索引。默认值为false.
namestring索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。
dropDupsBoolean在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 false.
sparseBoolean对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false.
expireAfterSecondsinteger指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。
vindex version索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。
weightsdocument索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。
default_languagestring对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语
language_overridestring对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language.

 在后台创建索引:

 db.values.ensureIndex({open: 1, close: 1}, {background: true})  

三、MongoDB高级索引

下面将会用到此文档举例:

{     
	"address": {       
		"city": "Los Angeles",     
		"state": "California",    
		"pincode": "123"    
	},    
	"tags": [        
		"music",       
		"cricket",     
		"blogs"     
	],
	"name": "Tom Benzamin" 
} 

 文档包含了 address 子文档和 tags 数组。

1、索引数组字段

假如我们基于标签来检索用户,那么我们需要对数组tags建立索引,在数组中创建索引,需要对数组中每个字段依次建立索引,所以我们将会对music、cricket、blogs三个值建立单独的索引。

使用命令:

>db.users.ensureIndex({"tags":1})  
创建索引后,我们可以这样检索集合的 tags 字段
>db.users.find({tags:"cricket"})  
为了验证我们使用使用了索引,可以使用 explain 命令:
>db.users.find({tags:"cricket"}).explain()  
以上命令执行结果中会显示 "cursor" : "BtreeCursor tags_1" ,则表示已经使用了索引。

2、索引子文档字段

假设我们需要通过city、state、pincode字段来检索文档,由于这些字段是子文档的字段,所以我们需要对子文档建立索引。

为子文档的三个字段创建索引,命令如下:
>db.users.ensureIndex({"address.city":1,"address.state":1,"address.pincode":1})  

一旦创建索引,我们可以使用子文档的字段来检索数据:
>db.users.find({"address.city":"Los Angeles"})     

记住查询表达式必须遵循指定的索引的顺序。所以上面创建的索引将支持以下查询:
>db.users.find({"address.city":"Los Angeles","address.state":"California"})   

同样支持以下查询:
>db.users.find({"address.city":"LosAngeles","address.state":"California","address.pincode":"123"})
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是小先生

知识是无价的,白嫖也可以的。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值