MongoDB允许深入文档内部,对嵌套字段和数组建立索引;嵌套对象和数组字段可以和复合索引中的顶级字段一起使用,多数情况下与“正常“索引字段的行为也是一致的。
,
<强>一、索引嵌套文档强>
例如,集合中的文档如下格式,
祝辞,db.post.findOne({“用户名”:“sid”}),,, {,,, ,,,,“_id”:, ObjectId (“54 aff7f43bd1048e7b585e39”),,,,, ,,,“用户名”,:,“sid”,,,,, ,,,“疯狂的”,:,{,,, ,,,,,,,“知识产权”,:,“为1.2.3.4”,,,,, ,,,,,,,“城市”,:,“斯普林菲尔德”,,,,, ,,,,,,,“状态”,:,“纽约”,,,, ,,,},,,, },,,, 在
需要在“地方”的城市上建立索引来提高这个地方。城市字段的查询速度:
祝辞,db.post.ensureIndex ({“loc.city”: 1}),,, {,,, ,,,,“createdCollectionAutomatically”:,假的,,,,, ,,,,“numIndexesBefore”:, 1,,,,, ,,,“numIndexesAfter”,:,,,,,, ,,,“ok”,,, 1,,,, },,,, 在
利用这种方式可以建立任意深度的索引,例如可以在X.Y.Z.A.B.C上建立索引。
但是,针对子文档“loc”上建立的索引,和建立在子文档的某个字段“loc.city”上的索引是不同的:
(1)对整个子文档上建立的索引,只会提高整个子文档的的查询速度,也就是说只有在完全匹配子文档的查询(包括字段顺序),子文档索引才会起作用;
(2)只有查询loc.city字段,索引loc.city才会起作用,其他情况索引loc.city不起作用;
,
<强>二、数组上的索引强>
(1)可以看得出在数组字段上建立索引的代价比较大,因为每次的删除,更新都会对每一个索引进行刷新,太消耗服务器的资源;
(2)可以针对数组字段中的某一个元素做具体的单独索引,减少索引的数量,例如,在数组字段评论中的第九个元素中的选票上建立索引:
祝辞,db.post.ensureIndex ({“comment.10.votes”: 1})
同样,只有精确匹配comment.10.votes查询,上述索引才会起到索引的作用。
,
<强>三,多键索引强>
如果在数组字段上创建索引,那么这个索引称为多键索引(多键)。
多键索引用解释函数中可以看到“isMultikey”字段的值为true,多键索引比非多键索引要慢一些;