MongoDB数据库查询、聚合、索引

原创 2018年04月15日 18:23:48

数据查询

  • find()方法

    db.集合名称.find({条件文档})

  • findOne()方法 只返回一个

    db.集合名称.findOne({条件文档})

  • pretty() 将结果格式化

    db.集合名称.find({条件文档}).pretty()

比较运算符

  • 等于,默认是等于判断,没有运算符
  • 小于$lt
  • 小于或等于$lte
  • 大于$gt
  • 大于或等于$gte
  • 不等于$ne

例如:

# 查询名称是spirit的学生
db.stu.find({name:"spirit"})
# 查询年龄大于或等于18的学生
db.stu.find({age:{$gte:18}})

逻辑运算符

  • and:在json中写多个条件即可

    查询年龄大于或等于18的,并且性别为true的学生

    db.stu.find({age:{$gte:18},gender:true})

  • or:用$or,值为数组即列表,数组中每个元素为json

    查询年龄大于18,或者性别为false的学生

    db.stu.find({$or:[{age:{$gt:18}},{gender:false}]})

  • and 和or 同时

    查询年龄大于18或者性别为男生,并且姓名是小红的学生

    `db.stu.find({or:[{age:{gte:18}},{gender:true}],name:’smallred’})

范围运算符

  • 使用$in,$nin判断是否在某个范围内

    查询年龄为18,28的学生

    db.stu.find({age:{$in:[18,28]}})

支持正则表达式

  • MongoDB提供的终端shell,也是一个js执行器,可以编写js代码和函数

  • 使用//或者$regex编写正则表达式

    db.stu.find({name:/^黄/})

    db.stud.find({name:{$regex:'^黄'}})

自定义查询

  • 使用$where后面写一个函数,返回满足条件的数据

    查询年龄大于30的学生

    db.stu.find({
      $where:function(){
          return this.age>30;
      }
    })

limit和skip

  • limit()方法,用户读取指定数量的文档

    db.集合名称.find().limit(NUMBER)

    • 参数NUMBER表示要获取文档的条数

    db.stu.find().limit(2) 查询两条学生信息

  • skip()方法,用于跳过指定数量的文档

    db.集合名称.find().skip(NUMBER)

    • 参数NUMBER表示跳过的记录条数,默认值为0

    db.stu.find().skip(2) 查询从第三条开始的学生信息

  • limit和skip一起用

    查询第5指8条数据

    db.stu.find().limit(4).skip(5)

    或者

    db.stu.find().skip(5).limit(4)

投影

  • 在查询到的返回结果中,只选择必要的字段

    db.集合名称.find({},{字段名称:1,…})

    参数为字段与值,值为1表示显示,值为0表示不显示

    对于_id列默认是显示的,如果不显示需要明确设置为0

    db.stu.find({},{_id:0,name:1,gender:1})

排序

  • sort()方法,用于对结果集进行排序

    db.集合名称.find().sort({字段:1,…})

    参数1位升序排列

    参数-1位降序排列

    db.stu.find().sort({gender:-1,age:1})

统计个数

  • 方法count(),用于统计结果集中文档条数

    • 方式1db.集合名称.find({条件}).count()
    • 方式2db.集合名称.count({条件})

    例如:

    统计男生人数

    db.stu.find({gender:true}).count()

    统计年龄大于20的男生人数

    db.stu.count({age:{$gt:20},gender:true})

消除重复

  • distinct()方法,对数据进行去重

    db.集合名称.distinct('去重字段',{条件})

    查找年龄大于18的学生

    db.stu.distinct('hometown',{age:{$gt:18}})

聚合aggregate

  • 聚合主要用于计算数据,类似于sql中的sum(),avg()

    db.集合名称.aggregate({管道:{表达式}})

    • 管道类似于Linux中命令里的管道,有同样作用
    • 常用管道
    • $group:将集合中的文档分组,可用于统计结果
    • $match:过滤数据,只输出符合条件的文档
    • $project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
    • $sort:将输入文档排序后输出
    • $limit:限制聚合管道返回的文档数
    • $skip:跳过指定数量的文档,并返回余下的文档
    • $unwind:将数组类型的字段进行拆分

表达式

处理输入文档并输出

表示式:'$列名'

  • 常用表达式

    • $sum:计算总和,$sum:1 表示以一倍计数
    • $avg:计算平均值
    • $min:获取最小值
    • $max:获取最大值
    • $push:在结果文档中插入值到一个数组中
    • $first:根据资源文档的排序获取第一个文档数据
    • $last:根据资源文档的排序获取最后一个文档数据
  • $group

    • 将集合中的文档分组,用于统计结果

    • -id表示分组的一句,使用某个字段的格式为$字段

    db.stu.aggregate(
        {$group:
            {
                _id:'$gender',
                counter:{$sum:1}
            }
        }
    )
  • $match

    • 用于过滤数据,只输出符合条件的文档

    查询年龄大于20的学生

    db.stu.aggregate(
        {$match:{age:{$gt:20}}}
    )
  • $project

    • 修改输入文档的结构,如重命名,增加,删除字段,创建计算结果

    • 查询学生的姓名,年龄

      db.stu.aggregate(
      {$project:{_id:0,name:1,age:1}}
      )
    • 查询男生女生人数,输出人数

      db.stu.aggregate(
      {$group:{_id:'$gender',counter;{$sum:1}}},
      {$project:{_id:0,counter:1}}
      )

  • $sort

    • 将输入文档排序后输出

    • 查询学生信息,按年龄升序

      b.stu.aggregate({$sort:{age:1}})

    • 查询男生,女生人数,按人数降序

      db.stu.aggregate(
      {$group:{_id:'$gender',counter:{$sum:1}}},
      {$sort:{counter:-1}}
      )
  • $limit 和$skip

    • $limit

    • 限制聚合管道返回的文档数

      查询2条学生信息

      db.stu.aggregate({$limit:2})

    • $skip

    • 跳过指定数量的文档,并返回余下的文档

      查询从第三条开始的学生信息

      db.stu.aggregate({$skip:2})

    • 统计男生,女生人数,按人数升序,取第二条数据

      db.stu.aggregate(
      {$group:{_id:'$gender',counter:{$sum:1}}},
      {$sort:{counter:1}},
      {$skip:1},
      {$limit:1}
      )
  • $unwind

    • 将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值

    db.集合名称.aggregate({$字段名称'})

    例如:

    db.t2.insert({_id:1,item:'t-shirt',size:['S','M','L']})
    db.t2.aggregate({$unwind:'$size'})
    
    
    # 结果如下
    
    { "_id" : 1, "item" : "t-shirt", "size" : "S" }
    { "_id" : 1, "item" : "t-shirt", "size" : "M" }
    { "_id" : 1, "item" : "t-shirt", "size" : "L" }
    • 对某字段值进行拆分

    • 处理非空数组,非数组,无字段,null情况

    • 属性preserveNullAndEmptyArrays值为false表示丢弃属性值为空的文档

    • 属性preserveNullAndEmptyArrays值为true表示保留属性值为空的文档

      db.inventory.aggregate({
        $unwind:{
            path:'$字段名称',
            preserveNullAndEmptyArrays:<boolean> #防止数据丢失
        }
      })

索引

  • 创建索引提升查询速度

  • 在默认情况下创建的索引均不是唯一索引

  • 创建唯一索引

    db.t1.ensureIndex({"name:1"},{"unique":true})

  • 联合索引,对多个属性建立一个索引,按照find()出现的顺序

    `db.t1.ensureIndex({name:1,age:1})

  • 查看文档所有索引

    db.t1.getIndexes()

  • 删除索引

    db.t1.dropIndex('索引名称')

mongodb 索引、聚合操作

MongoDB索引MongoDB的索引几乎与传统的关系型数据库索引一模一样。创建索引的方法:> db.trans.ensureIndex({card1: 1}) { "createdColle...
  • pizipeng2
  • pizipeng2
  • 2016-08-05 16:08:29
  • 1189

MongoDB查询、索引和聚合

初始化mongodb数据库 > use deng switched to db deng > db.createCollection("jingdong") #无参数 {"ok"...
  • djd1234567
  • djd1234567
  • 2015-06-07 13:53:01
  • 1655

二、MongoDB的高级查询(聚合、游标、管道、索引)

MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。 一、聚合 对于Mongodb中的聚合应...
  • huangliequan
  • huangliequan
  • 2016-02-04 11:51:45
  • 1529

mongodb aggregate 聚合操作

何为aggregate聚合操作?mongodb的聚合操作,接受一个名为pipeline的参数,和一个可选参数。从字面意义上看,pipeline为流水线,一条流水线上可以有一个或多个工序。所以,通俗的讲...
  • u010205879
  • u010205879
  • 2016-03-08 13:53:43
  • 2230

mongodb进阶二之mongodb聚合

上篇我们说了mongodb的高级查询:http://blog.csdn.net/stronglyh/article/details/46817789 这篇说说mongodb的聚合 一:mongod...
  • stronglyh
  • stronglyh
  • 2015-07-10 10:16:36
  • 2951

MongoDB——Aggregates聚合

转载:http://www.cnblogs.com/qingtianyu2015/p/5947802.html MongoDB聚合 1、aggregate():     1、概念...
  • Shiyaru1314
  • Shiyaru1314
  • 2016-10-14 10:50:24
  • 1138

mogodb亿万级数据性能测试

本机 i7四核 8G 废话少说 mogodb 最像sql的nosql 使用批量插入一次20万循环10次总共200万数据用时65秒(尝试一次50万不过报内存溢出了,原因未知) 插入2000万数据用时1...
  • h348592532
  • h348592532
  • 2014-10-14 15:07:47
  • 5485

mongodb 使用sort时的索引利用问题探究

在实际操作mongodb的过程中,发现将find与sort结合使用时,mongodb优先使用sort查询条件可以利用的索引,只有当sort查询条件没有索引可用时,才尝试利用find查询条件中的索引。...
  • u010205879
  • u010205879
  • 2016-03-09 14:06:59
  • 1642

mongodb创建2D索引

1、 MongoDB支持二维空间索引,这是设计时考虑到基于位置的查询。 如果需要使用这种索引,应确定对象中存储的字段是子对象或数组,前两个元素为X,Y坐标 2、插入数据      db.locat...
  • xiao_287130
  • xiao_287130
  • 2016-09-19 16:50:05
  • 1511

mongodb笔记04(MongoDB $type 操作符,Limit与Skip方法,sort()方法,索引,聚合(aggregate))

  • will5451
  • will5451
  • 2017-12-19 18:03:08
  • 138
收藏助手
不良信息举报
您举报文章:MongoDB数据库查询、聚合、索引
举报原因:
原因补充:

(最多只允许输入30个字)