`

mongodb中的排序和索引快速学习

阅读更多
  在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"
}
4
2
分享到:
评论
8 楼 di1984HIT 2014-10-24  
确实是啊~~~~~~~
7 楼 xiaobadi 2014-07-18  
我靠,你是怎么个学友合影的?
6 楼 nannan408 2013-11-26  
java_user 写道
这个最烦的是只能用精确匹配查询条件的索引,所以查询应该尽量简单。如果有复杂查询,强烈反对强行使用mongodb。

是的,一个查询都这么麻烦,让人很失望了,不论是什么db,简约是首要的,每个东西应该一句简单的东西就要能处理所有,不然还不如用 oracle.
5 楼 elgs 2013-01-21  
Good article, thank you.
4 楼 jackyrong 2013-01-21  
sodmewuhan 写道
你的头像是和张学友的合照吗?

YES
3 楼 eric_hwp 2013-01-21  
好基友,一辈子哦
2 楼 sodmewuhan 2013-01-21  
你的头像是和张学友的合照吗?
1 楼 java_user 2013-01-20  
这个最烦的是只能用精确匹配查询条件的索引,所以查询应该尽量简单。如果有复杂查询,强烈反对强行使用mongodb。

相关推荐

    MongoDB的分析和报告的解决方案

    MongoDB是一种流行的开源文档数据库系统,以其灵活性、可扩展性和高性能而受到许多企业和开发者青睐。...同时,不断学习和适应新的集成技术和最佳实践,将有助于进一步提升MongoDB在数据存储和分析领域的潜力。

    MongoDB学习笔记

    学习MongoDB不仅需要理解其基本的数据操作和管理,还需要了解其高级特性、集群部署、索引机制、日志系统、数据备份与恢复等方面的知识。接下来将基于提供的文件内容详细展开介绍MongoDB的相关知识点。 一、入门 1. ...

    大数据环境下mongoDB为何要加索引浅析

    在大数据环境下,MongoDB作为一款强大的NoSQL数据库系统,广泛应用于存储和处理海量数据。然而,随着数据量的不断增长,如何高效...希望本文的内容对你的MongoDB使用和学习有所帮助,让你在大数据处理中更加游刃有余。

    MongoDB in action 源码

    学习如何使用查询选择器、投影、排序、分组和聚合函数是理解MongoDB的关键。 4. 复合索引:为了提高查询性能,可以为字段创建索引。MongoDB支持单字段、复合字段以及地理空间索引,合理使用索引能显著提升查询效率...

    MongoDB 入门教程 chm手册

    MongoDB 的入门教程旨在帮助初学者快速掌握这个数据库系统的基本概念和操作。 《MongoDB 入门教程》CHM 手册可能涵盖以下关键知识点: 1. **数据模型**:MongoDB 使用类似 JSON 的文档结构(BSON)来存储数据,...

    MongoDB学习总结笔记

    MongoDB是一种流行的开源文档型数据库,属于NoSQL数据库家族,其设计目标是处理大量数据的同时提供高可用性和可扩展性。...对于初学者来说,这是一条有效的学习路径,有助于快速理解和应用MongoDB。

    玩转MongoDB4.0从入门到实践、MongoDB基本操作之CRUD、进阶之聚合、中索引的重要性、数据分片

    这一章节将详细介绍MongoDB中的基本操作——创建(Create)、读取(Retrieve)、更新(Update)和删除(Delete),即CRUD操作: 1. **插入文档**:利用`insert`或`insertOne`命令插入单个文档;使用`insertMany`批量插入多...

    MongoDB离线手册(含一个简易版和完全版)

    简易版可能还会涵盖基本的查询语言,如查询筛选、投影、排序和分组,以及如何使用索引来优化查询性能。 完全版手册则更全面,除了简易版的内容,它还涵盖了MongoDB的高级特性。这可能包括副本集,它是MongoDB实现高...

    mongodb学习

    MongoDB适用于需要快速开发和扩展的应用场景,尤其适合大数据量、高并发访问的互联网应用。 MongoDB的学习可以分为以下几个核心知识点: 1. **数据模型**:MongoDB采用的是文档型数据模型,每个文档都是BSON...

    mongodb压缩包

    在“mongodb压缩包”中,提供的3.0版本是MongoDB的一个重要里程碑,它带来了许多功能增强和优化,对于理解和使用MongoDB来说,这个版本具有很高的学习价值。 1. MongoDB基础概念: - 数据库:MongoDB中的数据库是...

    MongoDB入门学习

    ### MongoDB入门学习知识点详解 #### 一、MongoDB简介与特点 MongoDB是一款非常流行的开源文档型NoSQL数据库系统,采用C++语言实现,具备...通过这些基础知识的学习,可以帮助用户快速上手MongoDB并应用于实际项目中。

    MongoDB 入门

    同时,MongoDB还提供了聚合框架,用于处理数据的统计和分析,如计算平均值、分组、排序等。 在MongoDB中,索引是提高查询性能的关键。你可以为文档的任何字段创建单字段或复合索引,甚至可以创建地理位置索引。索引...

    MongoDB-manual

    - **排序与分组**:说明了如何在聚合管道中实现数据排序和分组。 #### 聚合示例 - **复杂查询**:通过构建复杂的聚合管道来完成高级查询任务。 - **性能优化**:给出了一些建议来提高聚合查询的执行效率。 #### ...

    Mongodb学习资料(Mongodb权威指南+实战班克)

    通过这两部分的学习,你不仅可以掌握MongoDB的基本操作,还能了解到如何在实际开发中高效地运用MongoDB,提升项目质量和性能。阅读这两本书籍,并结合实际操作,相信你将在MongoDB的世界中游刃有余。

    mongodb demo3.x

    MongoDB 是一个流行的开源、分布式文档数据库,常用于构建高性能、高可扩展性...在实际开发中,结合MongoDBDemo这样的示例代码,可以帮助开发者快速理解和掌握这些概念,从而更好地利用MongoDB来构建高性能的应用系统。

    MongoDB实战:MongoDB in Action

    10. **应用程序集成**:MongoDB支持多种编程语言的驱动程序,如Python、Java、Node.js等,书中会介绍如何在各种开发环境中集成和使用MongoDB。 11. **运维与监控**:书中还会讲解如何监控MongoDB实例的健康状况,...

    mongodb权威指南(中文第二版)

    MongoDB 是一个开源、分布式、高性能的文档型数据库系统,被广泛应用于大数据处理、Web 应用、实时分析等场景。《MongoDB 权威指南...书中的 HTML 文件方便你按章节逐步学习,同时利用目录和链接快速定位所需内容。

    深入学习MongoDB.pdf

    因此,我将根据标题“深入学习MongoDB.pdf”和描述,结合我自身对MongoDB的知识,构建相关的知识点。 MongoDB是一款流行的开源NoSQL数据库系统,主要用于管理大量的文档数据,并提供了高性能、高可用性和易扩展性的...

    10天掌握MongoDB

    MongoDB是一种流行的开源文档...通过这十天的学习,读者将全面掌握MongoDB的基础知识和核心技能,具备在实际项目中运用MongoDB的能力。无论你是初学者还是有经验的开发者,这套教程都能帮助你提升MongoDB的使用水平。

Global site tag (gtag.js) - Google Analytics