Mongodb学习笔记 - 2

这篇博客详细介绍了MongoDB的查找操作,包括各种操作符的使用,如判断、范围、逻辑操作符,还特别讨论了Array类型的查询,如数组的查询、比较及特定条件筛选。此外,还提及了其他的Query查询,如$exists、$mod和$type,并讲解了MongoDB的实用函数,如distinct()、pretty()、limit()、skip()、count()和sort()。文章最后涉及了文档的删除和修改操作。

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

目录


mongodb的查找操作
查找的用法示例
各种操作符
Array类型
其他Query查询
mongodb的其他函数


mongodb的查找操作

db.collection.find(query,field)
    参数
        query:查询条件,相当于where子句
        field:选择要展示的域,不写则展示所有内容
    返回值:
        返回查找到的文档
    
参数query:以键值对的形式给出查找条件
    示例:查找姓名为lucy的
    di.class.find({name:'lucy'})
    
    示例:查找age为18的学生的id
    db.collection.find({age:18},'_id')
    
参数field:表示要展示的域或者不展示的域,域名为键,0为不显示,1为显示
    示例:查找所有学生,不展示id
        db.collection.find({},{_id:0})
    注意:如果设置了某些域为0,那么没有设置的域默认为1
         如果设置某些1,其他域为0
         _id只有设置为0时才不显示,
         _id除了_id,其他域要么只能设置0,要么只能设置1
    findOne(query,field)
    功能:返回一条数据
    参数同find

mongodb的操作符

  • 判断操作符
    使用$号注明的一个特殊意义字符串。表达某个特殊含义
    $eq 等于
    $ne 不等于
    $gt 大于
    $gte 大于等于
    $lt 小于
    $lte 小于等于

    字符串也可以比较大小,大小按ascii编码排序
  • 范围操作符:
    $in 使用:{age:{$in:[1,20]}}
        说明:查找年龄为1或者20的
    $nin 跟in是相反的
  • 逻辑操作符
    逻辑与:$and
    使用:使用逗号隔开就是逻辑与
        db.collection.find({name:"zhangsan",age:{$gt:18}})
    逻辑或: $or 
    使用:
        db.collection.find({$or:[{age:{$gt:18}},{sex:"Man"}]})
    
    逻辑非:$not
        示例:查找age不为18的用户的两种方法
            db.collection.find({$not:{age:{$eq:18}}})
            db.collection.find({age:{$ne:18}})
    
    $ne 操作符 不等于
        具体操作看上个例子的第二种方法
        
    $nor:既不。。。也不。。。 not A and not B

查找的用法示例

    查找age等于17的用户
        db.collection.find({age:{$eq:17}})
    查找age大于等于18的用户
        db.collection.find({age:{$gte:18}})
    查找age为17且男性的用户
        db.collection.find({$and:[{age:17},{sex:"m"}]})
    查找age范围在18-40的用户或者名字为张三的男性
        db.collection.find($or:[{age:{$gt:17},{age:{$lt:41}}},{name:"zhangsan",sex:'Male'}])
    查找年龄不大于30,并且名字叫阿宝的用户或者是性别为女的用户
        db.collection.find({$or:[{age:{$lt:30},{name:"abao"}},{sex:"Male"}]})
    查找年龄小于30或者大于33,并且性别为女的
        db.collection.find({$and:[{$or:[{age:{$lt:30}},{age:{$gt:33}}]},{sex:"male"}]})
        db.collection.find({$or:[{age:{$gt:33}},{age:{$lt:30}}],{sex:"male"}},{_id:0})

Array类型

    表达:使用中括号将一定的数据组织为一种数据结构
    说明;
        1数组中的数据类型可以不同
        2数据是有序的
    利用数组插入数据
        db.NewClass.insert([{"name":"xiaoHong",'age':9,'score':[92,79,88]},
        {"name":"zzj",'age':24,'score':[99,99,99]}])
  • 数组的查询:
    db.collection.find({score:88})
    说明:虽然和普通查询语句一样,但是score是以数组形式存在的,因此,score只要含有88,就会被查询
  • 数组的比较查询
    db.collection.find({score:{$gt:88}})
    说明:只要有一项大于88,就会被查找
  • $size通过数组的元素个数查找
    示例1:
        db.collection.find({score:{$size:2}})
        表示查找数组中只有两项数据的用户被查找哦

  • $all指明数组中必须同时包含指定项进行搜索
    查找score中分数必须包含88和90的用户(还可以有其他数据)
    db.collection.find({score:{$all:[88,90]}})
  • $slice 取数组的部分进行显示
    取数组的部分进行显示,在field中声明
    
    示例:取数组的前两项进行搜索
    db.collection.find({},{_id:0,score:{$slice:2}})
    示例2:跳过第一项,显示后面两项
    db.collection.find({},{_id:0,score:{$slice:[1,2]}})

其他Query查询

  • $exists 判断一个域是否存在
    查找有sex域的文档
    db.collection.find({sex:{$exists:true}},{_id:0})
  • $mod 余数查找
    查找单数年龄的文档 [2,1]表示除以2余1的
    db.collection.find({age:{$mod:[2,1]}})
  • $type 数据类型查找
    查找age类型不是double类型的文档
        db.NewClass.find({age:{$not:{$type:1}}})
    注意:类型和别名在官网查看
    

mongodb的其他函数

  • 查找取值范围 distinct()
    功能:查看某个域的取值范围
    示例:查看集合的年龄的取值范围,如果age为字符串类型,会被单独列举出来
    db.NewClass.distinct("age")
  • 查找结果格式化 pretty()
    示例
    db.collection.find().pretty()
  • 分页函数 limit(n)
    limit(n)
    显示查找结果的前n条
  • 经常与分页函数搭配使用的跳过函数skip(n)
    skip(n)
    跳过前n条,显示后面的内容
    示例:
        跳过前三条
        db.collection.find().skip(3)
  • 计数函数count()
    查找一共有多少条数据
    db.collection.find().count()
  • 排序函数sort({field:1/-1})
    根据年龄大小升序排序
    db.collection.find().sort({age:1})
    
    参数:{field:1/-1}
        field:域
        1:升序
        -1:降序
        
    复合排序:当排序域的值相同时,按照第二排序项排序
        案例:如果结果集一段数据年龄相等,按照姓名排序
            db.collection.find().sort({age:1,name:1})

函数示例

  • 查找年龄最小的前三个用户
    db.collection.find().sort({age:1}).limit(3)

文档的删除操作:

db.collection.remove(query,justOne)
功能:删除文档
参数
    query:筛选数据
    jistOne:默认为False,表示删除所有符合条件的文档,如果设置为True则只删除第一条查找到的数据
删除年龄域不是数字的文档
    db.collection.remove({age:{$not:{$type:1}}})
删除有sex域的文档
    db.collection.remove({sex:{$exists:true}})
删除第一个age为17的文档
    db.collection.remove({age:17},{justOne:true})
删除集合所有的内容
    db.collection.remove({})

练习

1创建数据库 名字grade
2数据库中创建集合名字class
3集合中插入若干文档格式如下
{name:"zhang",age:10,sex:"m",hobby:["a","b",....]}
    年龄插入4-13随便选
    hobby可选项draw,,sing,dance,basketball,football,pingpong,running,computer
4查询联系
    查看班级所有人信息
        db.class.find()
    查看年龄大于10岁的学生信息 
        db.class.find({age:{$gt:10}},{_id:0})
    查看年龄8-11岁的学生信息
        db.class.find({$and:[{age:{$gte:8}},{age:{$lte:11}}]},{_id:0})
        db.class.find({age:{$gte:8},age:{$lte:11}})
    找到年龄9岁,且为男生的学生信息
        db.class.find({age:9,sex:"m"})
    找到年龄小于7岁,或者大于11岁的学生
        db.class.find({$or:[{age:{$lt:7},age:{$gt:11}}]})
    找到年龄8岁或者11岁的学生
        db.class.find({age:{$in:[8,11]}})
    找到有2项兴趣爱好的学生
        db.class.find({hobby:{$size:2}})
    找到喜欢computer的学生
        db.class.find({hobby:"computer"})
    找到即喜欢画画又喜欢跳舞的学生
        db.class.find({hobby:{$all:["draw","dance"]}})
5
    统计兴趣爱好有3项的学生人数
        db.class.find({hobby:{$size:3}}).count()
    找到本班年龄第二大的学生
        db.class.find().sort({age:-1}).skip(1).limit(1)
    查看学生兴趣爱好的范围
        db.distinct('hobby')
    找到年龄最小的三个同学
        db.class.find().sort({age:1}).limit(3)
    删除所有年龄小鱼6岁或者大于12岁的学生
        db.class.remove({$or:[{age:{$lt:6}},{age:{$gt:12}}]})

文档的修改

    db.collection.update(query,update,upsert,multi)
    参数:
        query:筛选要修改的文档,相当于where
        update:将筛选的文档修改什么内容,相当于set,需要配合修改操作符$set一起使用
        upsert:是个布尔值,默认false,表示如果query的文档不存在则不进行任何操作。如果设置为True,则
        如果query的文档不存在,就插入set的数据
        multi:布尔值,默认false表示一次只更新一条数据,设置为True的话,则修改所有文档
    示例:
    db.collection.update({name:"xiaobai"},{$set:{name:"xiaohei",age:34}})
    db.collection.update({name:"arong"},{$set:{age:29}},{upsert:true})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值