在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. 用xerces-c来进行xml schema校验

    在xerces-c的官方站点上有文章指引说明是怎样进行xml schema校验. http://xerces.apache.org/xerces-c/schema-3.html 给出的样例代码: // ...

  2. java常用内存设置

    Java虚拟机具有一个堆,是运行时的数据区域,所有类实例和数组内存均从此处分配.堆是在java虚拟机启动时创建的. 堆是留给开发人员用的内存区域.非堆就是JVM留给自己用的(方法区,JVM内部处理或优 ...

  3. php调用dll

    http://download.csdn.net/detail/pinghe2005/5108556

  4. 反射API

    反射,是指一种能在运行时动态加载.分析类的能力.反射被广泛地用于那些需要在运行时检测或修改程序行为的程序中.这是一个相对高级的特性,使用反射技术应当具备相当的Java语言基础.我们可以通过反射机制让应 ...

  5. Serialize a Binary Tree or a General Tree

    For a binary tree, preorder traversal may be enough. For example, _    /   \           /     /  \ 50 ...

  6. Selenium webdriver 常见问题

    出现java.lang.NoClassDefFoundError: org/w3c/dom/ElementTraversal 是因为缺少 xml jar ,如果使用的是maven 可以依赖 <d ...

  7. Java中ArrayList和LinkedList差别

    一般大家都知道ArrayList和LinkedList的大致差别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构.  2.对于随机訪问get和set.A ...

  8. Swift - 创建代理协议实现页面间参数传递和方法调用

    在开发中,经常需要用到协议代理模式.比如,进入编辑页面修改数据后,将新数据回传到主界面. 下面通过一个样例来说明协议代理模式,功能如下: 1,主页面有一个标签和一个修改按钮,点击修改按钮会跳转到编辑页 ...

  9. NTP工作机制及时间同步的方法

    Network Time Protocol(NTP)是用来使计算机时间同步化的一种协议,它能够使计算机对其server或时钟源做同步化,它能够提供高精准度的时间校正,且可用加密确认的方式来防止恶毒的协 ...

  10. dialog开发

    dialog开发屏幕编程:ok_code在程序里用sy-ucomm接受 调用其他事物代码:call transaction ‘SE38’. 1:50 选择屏幕之屏幕按钮: selection-scre ...