2MongoDB查找操作2数据操作函数3修改文档

本文对比了关系型数据库与非关系型数据库(如MongoDB)的特点,包括数据一致性、读写速度、结构灵活性及操作语句的统一性等。深入探讨了MongoDB的安装、命令设置、数据库与集合操作、文档管理、查询操作符使用、数据操作函数及文档修改方法。

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

  1. 关系型数据库和非关系型数据库对比

    • Nosql不是关系模型构建的数据库,不保证数据一致性,结构灵活

    • Nosql弥补了关系型数据库在处理高并发数据请求时读写速度慢的缺点

    • Nosql种类多样,技术成熟度不如关系型数据库,没有统一的操作语句,发展速度较快

  2. MongoDB数据库特点,安装,命令设置

  3. MongoDB的组成结构

  4. 创建数据库

    • use database 创建数据库
    • db.dropDatabase() 删除数据库
    • show dbs 查看数据库

    数据库命令: mongodump 备份
    mongorestore 恢复
    mongostat 数据库监控
    mongotop 监控读写时长

  5. 集合操作

    db.createCollecion() 创建集合
    db.collection.insert() 集合不存在自动创建
    db.collection.drop() 删除集合
    db.collection.renameCollection() 重命名
    db.getCollection() 获取集合对象
    show collections 查看集合

  6. 文档

    • bson数据类型
    • 键必须为字符串
  7. 插入文档

    insertOne() 插入单个文档
    insertMany() 插入多条文档
    insert() 可以插入一条或者多条文档
    save() 当_id冲突时可以修改原文档


一. 查找操作

  1. 命令格式

    mysql: select … from table where … ;

    mongo: db.collection.find(query,field)

  2. 查找函数使用

    find(query,field)
    功能:查找所有符合条件的文档,参数为空表示查找集合所有内容
    参数:query 表示查找条件,是一个键值对文档
    field 表示要查找的域,是一个键值对文档

    返回值: 返回查找到的所有文档

    【1】 query : 通过键值对表示条件关系
    e.g. {age:17} ==> age=17

    【2】 field : 键为域名,值为0表示不查找该域,1表示查找该域

    • _id域如果不查找须明确 _id:0
    • 普通域要么全指定为1,其他的默认是0,要么全指定为0,其他的默认为1

    e.g. 查找所有年龄17的name age域
    db.class0.find({age:17},{_id:0,name:1,age:1})

    findOne(query,field)
    功能: 查找第一个符合条件的文档
    参数: 同find
    返回值: 返回查找到的文档

二. query 操作符使用

  1. 操作符:mongodb中使用$符号注明一个有特殊意义的字串,用以表达丰富的含义,比如 $lt 表示小于

  2. 比较操作符

    【1】 $eq 等于 =

       e.g.  年龄等于17 
       db.class0.find({age:{$eq:17}},{_id:0})
    

    【2】 $lt 小于 <

    e.g. name小于Lucy(字符串可以比较大小)
    db.class0.find({name:{$lt:‘Lucy’}},{_id:0})

    【3】 $gt 大于 >

    e.g. 年龄大于16并且小于18的
    db.class0.find({age:{gt:16,gt:16,gt:16,lt:18}},{_id:0})

    【4】 $lte 小于等于 <=
    【5】 $gte 大于等于 >=
    【6】 $ne 不等于 !=

    【7】 $in 包含

       e.g. 查找年龄包含在16,17,18中的
    

    db.class0.find({age:{$in:[16,17,18]}},{_id:0})

    【8】 $nin 不包含

  3. 逻辑操作符

    【1】 $and 逻辑与

     e.g.  查找年龄为18并且性别为女的
     db.class0.find({$and:[{age:18},{sex:'w'}]},{_id:0})
     
     * query文档中,多个键值对条件默认就是并且关系
       e.g.  db.class0.find({age:18,sex:'w'},{_id:0})
    

    【2】 $or 逻辑或

     e.g. 年龄小于18 或者性别为女
     db.class0.find({$or:[{age:{$lt:18}},{sex:'w'}]},{_id:0})
    

    【3】 $not 逻辑非

     e.g.  年龄不小于18的
     db.class0.find({age:{$not:{$lt:18}}},{_id:0})
    

    【4】 $nor 逻辑异或 not (A or B)

     e.g. 性别不为男,年龄不大于18
     db.class0.find({$nor:[{sex:'m'},{age:{$gt:18}}]},{_id:0})
    

    【5】 混合条件语句

      * 年龄大于等于18或者小于17  并且 性别为女
    
      db.class0.find({$and:[{$or:[{age:{$gte:18}},{age:{$lt:17}}]},{sex:'w'}]},{_id:0})
    
       * 年龄大于等于18男生   或者   姓名为Levi或者Sunny
      
     db.class0.find({$or:[{age:{$gte:18},sex:'m'},{name:{$in:['Levi','Sunny']}}]},{_id:0})
    
  4. 数组查找操作符

    【1】 数组 : 一组数据的有序集合,用[]表示

    • 有序性
    • 数组中数据类型可以混合

    【2】 查找数组中某一项

      e.g. 查找数组score中包含大于90的文档
       db.class1.find({score:{$gt:90}},{_id:0})
    

    e.g. 查找数组中第一项大于90
    db.class1.find({‘score.0’:{$gt:90}},{_id:0})

      * 通过序列号表示数组某一项时必须加引号
    

    【3】 查找数组中同时包含多项 $all

     e.g. 查找数组中同时包含90  91的文档
     db.class1.find({score:{$all:[90,91]}},{_id:0})
    

    【4】 根据数组元素个数查找 $size

     e.g. 查找数组中有4项的
     db.class1.find({score:{$size:4}},{_id:0})
    

    【5】 选择数组中查找的项 $slice (用于field参数)

     e.g. 查找数组时只查找前两项
     db.class1.find({},{_id:0,score:{$slice:2}})
    
     e.g. 跳过数组前两项,显示接下来两项
     db.class1.find({},{_id:0,score:{$slice:[2,2]}})
    
  5. 其他查找操作符

    【1】 $exists 判断一个域是否存在

     e.g. 查找存在sex域的文档
     db.class0.find({sex:{$exists:true}},{_id:0})
    

    【2】 $mod 根据除数 和余数筛选文档

     e.g. 查找age除以2 余数 为1的文档
     db.class0.find({age:{$mod:[2,1]}},{_id:0})
    

    【3】 $type 根据数据类型查找

     e.g. 查找姓名域数据类型为2的文档
     db.class0.find({name:{$type:2}},{_id:0})
    

    *数据类型对应number和alias需要查看type表

三. 数据操作函数

  1. db.collection.distinct(field)
    功能:获取集合中某个域的取值
    参数:域名

    e.g. 查看年龄的取值情况
    db.class0.distinct(‘age’)

  2. pretty()
    功能:将find结果格式化显示

    e.g. db.class0.find().pretty()

  3. limit(n)
    功能:显示查询结果前n条

    e.g. 显示查询结果的前3条
    db.class0.find({},{_id:0}).limit(3)

  4. skip(n)
    功能: 跳过查询结果前n条,显示后边内容

    e.g. 跳过前3条文档,显示后面
    db.class0.find({},{_id:0}).skip(3)

  5. count()
    功能: 统计查询结果数量

  6. sort({field:1/-1})
    功能:对查找结果按照某个域排序
    参数:field表示排序的域,1表示正序,-1表示逆序

    e.g. 对查找结果按照年龄升序排序
    db.class0.find({},{_id:0}).sort({age:1})

    e.g. 可以进行复合排序
    db.class0.find({},{_id:0}).sort({age:1,name:1})

  7. 函数的连续调用获取更丰富结果

    查找年龄最大的三位同学
    db.class0.find().sort({age:-1}).limit(3)

  8. 通过序列号直接获取查找结果某一项

    获取第二个男生文档
    db.class0.find({sex:‘m’},{_id:0})[1]

练习:

  1. 创建数据库名为 grade
    use grade

  2. 在数据库中创建集合 class

  3. 集合中插入文档若干,格式如下

    {name:xxx,age:xx,sex:xx,hobby:[xx,xx,xx]}

    年龄: 7–15
    hobby:draw dance running sing football basketball
    computer python

db.class.insertOne({name:xxx,age:xx,sex:xx,hobby:[xx,xx,xx]})   
  1. 查找练习
查看班级所有人信息
 find()

查看班级中年龄8岁的学员信息
 find({age:8})

查看年龄大于10岁的所有学生
 find({age:{$gt:10}})

查看年龄在8-12岁的学生
 find({age:{$gte:8,$lte:12}})

查看年龄为9岁且喜欢画画的女生
 find({age:9,hobby:'draw',sex:'w'})

查看年龄小于8岁或者大于12岁的学生
 find({$or:[{age:{$lt:8}},{age:{$gt:12}}]})

查看年龄9岁到11岁学生
 find({age:{$in:[9,11]}})

查看有两项兴趣爱好的学生
 find({hobby:{$size:2}})

查看喜欢计算机的同学
 find({hobby:'computer'})

查看喜欢画画又喜欢跳舞的女生
 find({sex:'w',hobby:{$all:['draw','dance']}})

统计兴趣有3项的学生人数
 find({hobby:{$size:3}}).count()

找到班级中年龄第二大的学生
 find().sort({age:-1}).skip(1).limit(1)

查看班级同学都有哪些爱好
 db.class.distinct('hobby')

找到年龄最小的2个男生
 find({sex:'m'}).sort({age:1}).limit(2)

四. 修改文档

  1. 格式对比

    mysql:update table set … where …

    mongo: db.collection.updateOne(query,update,upsert)

  2. 修改函数

【1】 updateOne(query,update,upsert)
功能: 修改第一个符合条件的文档
参数:query 筛选条件
update 要修改的数据项,需要同修改器一起使用
upsert 表示当要修改的项没有找到时是否插入新的文档

 e.g.  将dail年龄修改为16 
 db.class0.updateOne({name:'Dail'},{$set:{age:16}})

     e.g. 如果没有找到Alex则插入新的文档
 db.class0.updateOne({name:'Alex'},{$set:{age:19}},{upsert:true})

【2】 updateMany(query,update,upsert)
功能:修改所有符合条件的文档
参数:用法同updateOne

      e.g.  修改所有不存在sex域年龄为20
  db.class0.updateMany({sex:{$exists:false}},{$set:{age:20}}) 

【3】 db.collection.update(query,update,upsert,multi)

  功能: 修改一条或者多条文档
  参数: query,update参数用法同上
        upsert 含义同上,用法为直接复制 upsert=ture
            multi 为false 表示只修改一条,为true表示修改多条
      
  e.g. 修改所有年龄20的为年龄21
  db.class0.update({age:20},{$set:{age:21}},false,true)

作业:

  1. 熟练今天所学函数和操作符用法
  2. 将’银行’数据库 练习查找和基础修改
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值