在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. POJ - 1006 Biorhythms 周期相遇 两个思路程序

    Description Some people believe that there are three cycles in a person's life that start the day he ...

  2. IMAP和POP3有什么差别?

    servCode=6010376">POP3协议同意电子邮件client下载server上的邮件,可是在client的操作(如移动邮件.标记已读等),不会反馈到server上.比方通过 ...

  3. clearcase常用命令

    版本控制工具学习 http://www.itpxpj.com/course.do?method=getAllCourseInFront&classTypeId=21 1.[ClearCase] ...

  4. 三篇IMO的文章

    http://column.iresearch.cn/b/201411/687499.shtml?from=singlemessage&isappinstalled=1 http://colu ...

  5. VHDL TestBench 测试终止时自动结束仿真——assert方法

    可在结束仿真位置添加如下代码: assert false report "Simulation is finished!" severity Failure; 则在Modelsim ...

  6. 如何使用Reaver破解Wi-Fi网络的WPA密码

    via: http://lifehacker.com/5873407/how-to-crack-a-wi+fi-networks-wpa-password-with-reaver 译者:Mr小眼儿 本 ...

  7. 用asio的定时器实现带超时的connect,备忘

    // test.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <boost/asio.hpp> #inclu ...

  8. Problem K: Yikes -- Bikes!

    http://acm.upc.edu.cn/problem.php?id=2780 昨天做的题,没过……!!!伤心……题意:给你n个单位,n-1组关系,让你单位换算……解题思路:Floyd算法自己听别 ...

  9. python处理中文字符

    1.在py文件中使用中文字符 unicode.py文件内容如下所示: # -*- coding:utf-8 -*- str_ch = '我们women' uni_ch = u'我们women' pri ...

  10. Delphi中获取某类的祖先类及其所在单元名称(使用GetTypeData(PClass.ClassInfo)函数,并且该类是从TPersistent类的派生类才可以这么使用)

    前几天在CSDN社区看到一篇<如何得到自身单元名称>的帖子,其中一位名为sdzeng网友给出了答案.受此启发,自己写了一个函数,用来获取指定类的所有祖先类的名称及其所在的单元名称. //参 ...