在MongoDB中添加索引

    MongoDB允许你对集合中的字段建立索引,以便更快地找到文档。当你在MongoDB中添加一个索引时,后台创建一个特殊的数据结构,其中存储集合的一小部分数据并优化此数据结构,以便能够更快地找到特定的文档。

    例如,对一个_id索引基本上是建立_id值的排序的数组。一旦该索引已经创建,你将获得以下好处:

  • 当按照_id查找对象时,你可以对有序索引执行优化的搜索,找到上述的对象。
  • 假定你要让对象按_id排序。因为已经对索引进行了排序,所以不需要再次对对象进行排序。MongoDB只需要按照文档的_id在缩影中出现的顺序读取文档即可。
  • 如果要将文档10-20按照_id进行排序,这个操作只是切片,它从索引拿出一块,以获得_id值,这样你就可以查找对象。
  • 最重要的是,如果你需要的是有序的_id值的列表,MongoDB甚至根本不需要读入文档,它可以只从索引中直接返回值。

   但是,你必须记住,要获得这些好处必须付出代价。下面是一些与索引相关的成本:

  • 索引占用磁盘和内存的空间。
  • 当你插入和更新文档时,索引要占用处理的时间。因此,数据库写入具有大量索引的集合可能遭受性能损失。
  • 集合越大,在资源和性能方面的成本就越大。对于极其大的集合,应用一些索引可能是不实际的。

    有几种不同类型的索引可以被应用到集合的字段上,以致辞不同的设计要求。下表列出了不同的索引类型。

MongoDB支持的索引类型
索引说明
_id所用的MongoDB集合在默认情况下对_id索引,如果应用程序没有指定_id值,驱动程序或mongodb将创建一个带有objectID值的_id字段。该_id索引是唯一的,它可以防止客户端插入_id值相同的两个文档
单字段最基本的索引类型是在单字段上的索引。这类似于_id索引,但它能在你需要的任何字段上建立,这种缩影可以按升序或降序排序。其中字段的值并不是唯一的。例如 {name:1}
复合你可以指定在多个字段上的索引。该索引先按第一个字段的值进行排序,然后按第二个字段。
多键如果添加存储条目数组的字段,对数组中每个元素的单独索引也将被创建。这使你可以使用包含在索引中的值更快速地查找文件。例如,考虑名为myObjects的对象,其中每个对象都有一个score字段的数组:{myObjects.score:1}
地理空间的MongoDB允许你根据2D或2sphere坐标创建一个地理空间索引。这使你可以更有效的存储和检索应用地理空间位置的数据
文本MongoDB支持添加文本索引,用来更快地查找在索引内部按照单词包含的字符串元素。该索引不存储类似the,a,and等单词。例如:{connect:"text"}
散列当使用基于散列的分片时,MongoDB允许你使用散列索引,它只对与存储在特定服务器的值匹配的散列值进行索引。这减少了保持其他服务器上条目的散列值的开销。例如:{key:"hashed"}

    你可以给索引设置特定的属性来定义MongoDB如何处理索引。

  • unique:此属性强制索引只包含每个字段值的一个实例,因此MongoDB将拒绝加入与已经在索引中的值重复的文档
  • sparse:此属性确保索引只包含具有索引字段的文档条目。该索引将跳过未包含被索引的字段的文档
  • TTL:TTL或生存期,索引应用这个该娘来允许文档仅在索引中存在一定量的时间(例如,一定量的时间后应清理的日志条目或事件数据)。该索引跟踪插入的时间,并删除已经过期的最早条目。

   你可以结合unique和sparse,以拒绝对索引字段有重复值的文档进行索引,并拒绝所有不包含被索引字段的文档。

    你可以从MongoDB shell,MongoDB Node.js原生客户端或Mongoose创建索引。若要从MongoDB shell创建索引,应该使用ensureIndex(index,properties)方法。例如:

db.myCollection.ensureIndex({name:1},{background:true,unique:true,sparse:true})

     background选项指定所创建的索引是应该发送在shell的前台还是后台。在前台运行完成的速度更快,但占用更多的系统资源。所以在生产系统的高峰时期,在前台运行不是个好主意。

  若要从MongoDB Node.js原生驱动程序创建索引,你可以在Db对象的一个实例上调用ensureIndex(collection,index,options,callback)方法。例如:

var MongoClient = require('mongdb').MongoClient;
MongoClient.connect(",ongodb://localhost/",function(err,db){
	db.ensureIndex('myCollection',{name:1},
		{background:true,unique:true,sparse:true},
		function(err){
			if(!err)console.log("Index Created");
		});
});

    要使用Mongoose中的Schema对象创建索引,可以对在该模式中的字段设置index选项,例如:

var s= new Schema({name:{type:string,index:true,unique:true}});

    你也可以在以后使用index()方法为模式对象添加索引。例如:

s.schema.path('some.path').index({unique:true,sparse:true});

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值