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

本文介绍了MongoDB的数据查询,包括find()、findOne()、比较运算符、逻辑运算符、范围运算符和正则表达式等。还详细讲解了聚合操作,如$group、$match、$project等,并提到了索引的创建与管理,以提高查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据查询
  • 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:{ 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('索引名称')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值