在mongodb中,排序和索引其实都是十分容易的,先来小结下排序:

1 先插入些数据 
   db.SortTest.insert( { name : "Denis", age : 20 } ) 
db.SortTest.insert( { name : "Abe", age : 30 } ) 
db.SortTest.insert( { name : "John", age : 40 } ) 
db.SortTest.insert( { name : "Xavier", age : 10 } ) 
db.SortTest.insert( { name : "Zen", age : 50 } )

2 然后默认检索一下 
   db.SortTest.find() 
{ "_id" : ObjectId("50f6811c03141917bce6459f"), "name" : "Denis", "age" : 20 } 
{ "_id" : ObjectId("50f6811d03141917bce645a0"), "name" : "Abe", "age" : 30 } 
{ "_id" : ObjectId("50f6811d03141917bce645a1"), "name" : "John", "age" : 40 } 
{ "_id" : ObjectId("50f6811d03141917bce645a2"), "name" : "Xavier", "age" : 10 } 
{ "_id" : ObjectId("50f6811e03141917bce645a3"), "name" : "Zen", "age" : 50 } 
  排序的话,注意1是升序,-1是降序,如下: 
  db.SortTest.find().sort({name: -1}) ,则对name字段降序 
  { "_id" : ObjectId("50f6811e03141917bce645a3"), "name" : "Zen", "age" : 50 } 
{ "_id" : ObjectId("50f6811d03141917bce645a2"), "name" : "Xavier", "age" : 10 } 
{ "_id" : ObjectId("50f6811d03141917bce645a1"), "name" : "John", "age" : 40 } 
{ "_id" : ObjectId("50f6811c03141917bce6459f"), "name" : "Denis", "age" : 20 } 
{ "_id" : ObjectId("50f6811d03141917bce645a0"), "name" : "Abe", "age" : 30 } 
  可以同时多个字段的排列,比如: 
   db.SortTest.find().sort( { age: -1 , name: 1} );

3 关于索引 
  首先,mongodb的是B-tree的索引了。要注意的是,一个collection不能超过64个索引, 
索引的大小不能超过1024字节,其中包括字段名和值和命名空间。 
   首先照样创建数据: 
db.Indexing.insert( { name : "Denis", age : 20 } ) 
db.Indexing.insert( { name : "Abe", age : 30 } ) 
db.Indexing.insert( { name : "John", age : 40 } ) 
db.Indexing.insert( { name : "Xavier", age : 10 } ) 
db.Indexing.insert( { name : "Zen", age : 50 } ) 
  首先,尝试看下mongodb的执行计划: 
db.Indexing.find({name: "Denis"}).explain(),这个是看当查找Denis的执行情况, 
结果如下: 
  { 
        "cursor" : "BasicCursor", 
        "isMultiKey" : false, 
        "n" : 0, 
        "nscannedObjects" : 0, 
        "nscanned" : 0, 
        "nscannedObjectsAllPlans" : 0, 
        "nscannedAllPlans" : 0, 
        "scanAndOrder" : false, 
        "indexOnly" : false, 
        "nYields" : 0, 
        "nChunkSkips" : 0, 
        "millis" : 0, 
        "indexBounds" : {

}, 
        "server" : "Denis:27017" 

  
下面加个索引,如下: 
   db.Indexing.ensureIndex({name: 1}); 
  其中依然,1是升序,-1是降序,再看下执行计划: 
db.Indexing.find({name: "Denis"}).explain() 
结果为: 
  { 
        "cursor" : "BtreeCursor name_1", 
        "isMultiKey" : false, 
        "n" : 1, 
        "nscannedObjects" : 1, 
        "nscanned" : 1, 
        "nscannedObjectsAllPlans" : 1, 
        "nscannedAllPlans" : 1, 
        "scanAndOrder" : false, 
        "indexOnly" : false, 
        "nYields" : 0, 
        "nChunkSkips" : 0, 
        "millis" : 1, 
        "indexBounds" : { 
                "name" : [ 
                        [ 
                                "Denis", 
                                "Denis" 
                        ] 
                ] 
        }, 
        "server" : "Denis:27017" 

   可以看到,"cursor" 一栏中,已经变成了btree了;并且"indexBounds" :中现在有内容了。 
  然后可以删除索引: 
  db.Indexing.dropIndex({name: 1}); 
  删除所有索引 
   
4 创建唯一索引 
   db.Indexing.ensureIndex({name: 1}, {unique: true}); 
  也就是加上{unique: true}就可以了

5 创建复合索引 
   比如要创建name和age的复合索引,直接如下 
db.Indexing.ensureIndex({name: 1, age : 1}); 
  如果要复合唯一索引,则: 
   db.Indexing.ensureIndex({name: 1, age : 1}, {unique: true}) 
   同样要注意的是,复合索引,要一起用才有效果,比如: 
  db.Indexing.find({name: "Denis"}).explain(),只按一个NAME,索引使用情况为: 
  { 
        "cursor" : "BtreeCursor name_1_age_1", 
        "isMultiKey" : false, 
        "n" : 1, 
        "nscannedObjects" : 1, 
        "nscanned" : 1, 
        "nscannedObjectsAllPlans" : 1, 
        "nscannedAllPlans" : 1, 
        "scanAndOrder" : false, 
        "indexOnly" : false, 
        "nYields" : 0, 
        "nChunkSkips" : 0, 
        "millis" : 0, 
        "indexBounds" : { 
                "name" : [ 
                        [ 
                                "Denis", 
                                "Denis" 
                        ] 
                ], 
                "age" : [ 
                        [ 
                                { 
                                        "$minElement" : 1 
                                }, 
                                { 
                                        "$maxElement" : 1 
                                } 
                        ] 
                ] 
        }, 
        "server" : "Denis:27017" 

  如果db.Indexing.find({age: "20"}).explain(),则没能使用索引 

        "cursor" : "BasicCursor", 
        "isMultiKey" : false, 
        "n" : 0, 
        "nscannedObjects" : 5, 
        "nscanned" : 5, 
        "nscannedObjectsAllPlans" : 5, 
        "nscannedAllPlans" : 5, 
        "scanAndOrder" : false, 
        "indexOnly" : false, 
        "nYields" : 0, 
        "nChunkSkips" : 0, 
        "millis" : 0, 
        "indexBounds" : {

}, 
        "server" : "Denis:27017" 
}

mongodb中的排序和索引快速学习的更多相关文章

  1. 在MongoDB中执行查询、创建索引

    1. MongoDB中数据查询的方法 (1)find函数的使用: (2)条件操作符: (3)distinct找出给定键所有不同的值: (4)group分组: (5)游标: (6)存储过程. 文档查找 ...

  2. 在MongoDB中执行查询与创建索引

    实验目的: (1)掌握MongoDB中数据查询的方法: (2)掌握MongoDB中索引及其创建: 实验内容: 一. MongoDB中数据查询的方法: (1)find函数的使用: (2)条件操作符: a ...

  3. MongoDB索引05-30学习笔记

    MongoDB 索引 索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录. 这种扫描全集合的查询效率是非常低的,特别在处理大 ...

  4. oracle中索引快速全扫描和索引全扫描的区别

    当进行index full scan的时候 oracle定位到索引的root block,然后到branch block(如果有的话),再定位到第一个leaf block, 然后根据leaf bloc ...

  5. mongodb中分页显示数据集的学习

    这次继续看mongodb中的分页.首先依然是插入数据: 1) db.Blog.insert( { name : "Denis",  age : 20, city : "P ...

  6. MongoDB 大数据技术之mongodb中在嵌套子文档的文档上面建立索引

    一.给collection objectid赋自定义的值 MongoDB Enterprise > db.testid.insert({_id:{imsi:"4567890123&qu ...

  7. MongoDB快速学习笔记

    一,下载. XP系统,32位的下载地址: https://www.mongodb.org/dl/win32/i386 例:win32/mongodb-win32-i386-2.0.7.ziphttp: ...

  8. MongoDB中的映射,限制记录和记录拼排序 文档的插入查询更新删除操作

    映射 在 MongoDB 中,映射(Projection)指的是只选择文档中的必要数据,而非全部数据.如果文档有 5 个字段,而你只需要显示 3 个,则只需选择 3 个字段即可. find() 方法 ...

  9. js_html_input中autocomplete="off"在chrom中失效的解决办法 使用JS模拟锚点跳转 js如何获取url参数 C#模拟httpwebrequest请求_向服务器模拟cookie发送 实习期学到的技术(一) LinqPad的变量比较功能 ASP.NET EF 使用LinqPad 快速学习Linq

    js_html_input中autocomplete="off"在chrom中失效的解决办法 分享网上的2种办法: 1-可以在不需要默认填写的input框中设置 autocompl ...

随机推荐

  1. CentOS6 yum源支持更多rpm包的升级(使用第三方软件库EPEL、RPMForge与RPMFusion)

    转载于http://blog.csdn.net/erazy0/article/details/6878153 在CentOS下运行yum install flash-plugin或yum instal ...

  2. java基本数据类型转换成byte[]数组

    import java.io.UnsupportedEncodingException;  public class ConToByte {      /**     * double转换byte   ...

  3. Qt递归拷贝和删除目录

    最近在翻看项目代码时,看到了这两个函数,想到这个功能十分常用,因此拿出来与大家分享,希望对大家有用.几点说明: 1.记得当初写代码那会,是参考了网上的帖子写的,做了一点小修改.因此代码源于网络. 2. ...

  4. 前端javascript框架之AngularJS学习笔记

    <!doctype html><html lang="en" ng-app><head><meta charset="utf-8 ...

  5. Android中View绘制优化之三---- 优化View

    本文原创, 转载请注明出处:http://blog.csdn.net/qinjuning 译三: 优化视图 关于如何设计自定义View以及响应触摸时间等,请看Android developer : 地 ...

  6. MD5加密以及验证加密-加盐

    加密与解密算法: /// <summary> /// 签名字符串 32位 /// </summary> /// <param name="input" ...

  7. Python easy_insatll 安装包

    Python 使用 easy_instal安装第三方扩展包更容易 easy insatll 下载地址 https://pypi.python.org/pypi/setuptools/ windows ...

  8. 红眼技术博客 » redis连接池红眼技术博客 » redis连接池

    红眼技术博客 » redis连接池 redis连接池

  9. openfire学习4------->android客户端聊天开发之聊天功能开发

    前面我们已经把服务器搭建完成,并且在客户端实现了登录了. 和我们使用的QQ一样,想一想,登录成功之后呢?肯定是要有一个好友列表,通过这个列表,我们可以选择我们需要聊天的好友. 这里我们先研究下 xmp ...

  10. MFC-消息分派

    前言 由于工作需要,这几天学了一点MFC,在AFX里看到很多熟悉的东西,如类型信息,序列化,窗口封装和消息分派.几乎每个界面库都必须提供这些基础服务,但提供的手法却千差万别.MFC大量地借用了宏,映射 ...