【MongoDB】增删改查、比较、排序、正则、投影、统计

本文介绍了MongoDB中数据增删改查的基本操作方法,包括如何插入、查询、更新及删除文档,以及一些高级查询技巧如排序、投影和统计等。

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

1.增加数据

命令:
db.集合名.insert(document) ,插入一个文档
db.集合名.insertMany(data) ,插入多个文档
db.集合名.save(document) , 插入或更改文档

use test3  # 切换数据库,不存在不会报错
db.stu.insert({name:'pan', gender: 'man'})  # 插入文档
db.stu.insert({_id:"20201108",name:"mei",num:18})  # 自定义_id值
db.stu.find({name:"pan"})  # 查看文档

data = [{name:"小明"},{age:18},{height:165.5}]
db.stu.insertMany(data)  # 插入多条数据

db.stu.save({_id:'20201108', name:'ice'})

save()与insert()的区别:当主键已经存在,insert会报错,save则是更新数据

2.查询数据

命令:
db.集合名称.find({条件文档}) ,返回所有符合条件的文档
db.集合名称.findOne({条件文档}) , 返回第一个符合条件的文档
db.集合名称.find({条件文档}).pretty() 返回格式化后的文档,不能与findOne()一起使用

先插入练习数据

db.stu.insert([{"name" : "郭靖", "hometown" : "蒙古", "age" : 20, "gender" : true },
{"name" : "黄蓉", "hometown" : "桃花岛", "age" : 18, "gender" : false },
{"name" : "华筝", "hometown" : "蒙古", "age" : 18, "gender" : false },
{"name" : "黄药师", "hometown" : "桃花岛", "age" : 40, "gender" : true },
{"name" : "段誉", "hometown" : "大理", "age" : 16, "gender" : true },
{"name" : "段王爷", "hometown" : "大理", "age" : 45, "gender" : true },
{"name" : "洪七公", "hometown" : "桃花岛", "age" : 50, "gender" : true }])

查询数据

db.stu.find({}) # 查看所有文档
db.stu.find({gender:"male"})
db.stu.findOne({gender:"male"})  # 只返回第一个符合要求的文档
db.stu.find({gender:"male"}).pretty()  # 格式化结果
3.更改数据

命令:db.集合名称.update({query}, {update}, {multi: boolean})
参数说明:

query:查询条件
update:更新操作符,默认更新是整个文档都更新,若想局部更新应该配合$set
multi:是否更新所有文档,默认是false

db.stu.find({hometown:"蒙古"})  # 先看一下原数据
db.stu.update({hometown:"蒙古"},{"name" : "郭靖", "hometown" : "蒙古", "age" : 22, "gender" : true})  # 只改了age,其他的都不改变
db.stu.find({hometown:"蒙古"})  # 查看变化
db.stu.update({hometown:"蒙古"},{"age" : 23})  # 只剩下"age",其他信息全部没有了
db.stu.find({hometown:"蒙古"})  # 根据这个查询条件已经找不到之前的那个记录了

db.stu.find({hometown:"蒙古"})
db.stu.update({hometown:"蒙古"},{$set:{"age":19}})  # 只改变指定字段,局部更新
db.stu.find({hometown:"蒙古"})  # 其他字段依然保留

db.stu.find({hometown:"大理"})
db.stu.update({hometown:"大理"},{$set:{hometown:"大理国","gender":false}},{multi:true})  # 批量局部更新
db.stu.find({hometown:"大理国"})

4.删除数据

命令:
db.集合名.remove({文档}),删除文档
db.集合名.remove({}) ,删除所有文档

db.stu.find({hometown:"桃花岛"})

db.stu.remove({hometown:"桃花岛"},{justOne:true})  # 只删除第一个hometown为桃花岛的文档

db.stu.remove({hometown:"桃花岛"})  # 删除所有hometown为桃花岛的文档

db.stu.remove({})  #删除全部文档
5.高级查询
5.1 比较运算符

$lt(小于)、$lte(小于等于)、$gt(大于)、$gte(大于等于)、$ne(不等于)

db.stu.find({age:18})  # 等于(默认)
db.stu.find({age:{$lt:18}})  # 小于18
db.stu.find({age:{$lte:18}})  # 小于等于18
db.stu.find({age:{$gt:18}})  # 大于18
db.stu.find({age:{$gte:18}})  # 大于等于18
db.stu.find({age:{$ne:18}})  # 不等于18
5.2 逻辑运算符

and,逻辑与,用逗号分开即可
$or,逻辑或,值为数组,元素为json

db.stu.find({age:{$lt:18},gender:true})  # age小于18并且gender为true
db.stu.find({$or:[{age:{$lt:18}},{gender:false}]})  # age小于18或者gender为false
5.3 范围运算符

$in(在), $nin(不在),在不在某个数组内

db.stu.find({age:{$in:[18, 40]}})
5.4 正则表达式

$regex,编写正则表达式

# 查询name以'黄'开头的英雄
db.stu.find({name:{$regex:'^黄'}})
5.5 skip和limit

db.集合名.find().skip(NUMBER),跳过指定数量的文档
db.集合名.find().limit(NUMBER),限制读取文档的数量

# 查询前2条学生信息
db.stu.find().limit(2)
# 跳过前两条
db.stu.find().skip(2)
# 跳过2个并且只查询2个
db.stu.find().skip(2).limit(2)
5.6 排序

db.集合名称.find().sort({字段:1,...}),参数1为升序,-1为降序

# 根据年龄降序
db.stu.find().sort({age:-1})
5.7 投影

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

参数为字段与值,值为1表示显示, 值为0不显
_id列默认显示, 如果不显示则置为0

# id不显示,只显示name和age字段
db.stu.find({},{_id:0,name:1,age:1})
5.8 统计个数

db.集合名.find({条件}).count()
db.集合名.count({条件})

# 查询年龄为18岁的数据一共有多少条
db.stu.find({age:18}).count()
db.stu.count({age:18})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰冷的希望

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值