MongoDB使用教程
一、基本概念
一)数据库(database)
数据库是一个仓库,在仓库中可以存放集合
二)集合(collection)
集合类似于数组,在集合中可以存放文档
三)文档(document)
文档是数据库中的最小单位,存储和操作的内容都是文档
在MongoDB中,数据库和集合都不需要手动创建,当我们创建文档时,如果文档所在的集合或数据库不存在会自动创建数据库和集合。
二、基本指令
# 显示有多少个数据库
show dbs 、show databases
# 进入到指定数据库中
use 数据库名
# 当前所处的数据库
db
# 显示数据库中所有的集合
show collections
三、增删改查(CRUD)操作
插入文档
- db.<collection>.insert(doc)
- db.<collection>.insertOne(doc) 只能插入一个文档
- db.<collection>.insertMany(doc) 必须传多个,用数组阔起来
# 例:向 stus 集合中插入一个新的学生对象
db.stus.insert({name:"孙悟空",age:18,gender:"男"})
查询当前集合中所有的文档
- db.<collection>.find() 返回集合中所有文档(返回的是一个数组)
- db.<collection>.find({}) 用来查询集合中所有符合条件的文档(返回的是一个数组)
- db.<collection>.findOne() 用来查询集合中符合条件的第一个文档(返回的是一个对象)
- db.<collection>.find().count() 查询符合条件的个数
db.stus.find({name:"dfs"}) # 查询 name 为 dfs 的文档
db.user.find({}, {name: 1, age: 1}); # 查询指定列 name、age 数据(使用了投影);
db.user.find({age: {$gt: 25}}, {name: 1, age: 1}); # 查询指定列 name、age 数据, 并且age > 25;
db.user.find({name: /^mongo/}); # 查询 name 中以 mongo 开头的数据
db.user.find({name: /mongo/}); # 查询 name 中包含 mongo 的数据,多用于模糊查询搜索
通过内嵌文档的属性值进行查询
# 下列例子中,hobby就是内嵌文档
{
name:'liu',
hobby:{
movies:['movie1','movie2'],
cities:['zhuhai','chengdu']
}
}
db.users.find({"hobby.movies":'movie1'}) //注意:此时查询的属性名必须加上引号
查询操作符的使用
$gt 大于,$gte 大于等于,$lt 小于,$lte 小于等于,$ne 不等于,$eq 等于,$or 或者
db.users.find({num:{$gt:200}}) # 大于200
db.users.find({num:{$gt:200,$lt:300}}) # 大于200小于300
db.users.find({$or:[{num:{$gt:300}}, {num:{$lt:200}}]}) # 大于300或小于200
分页查询
- db.users.find().skip(页码 - 1 * 每页显示的条数).limit(每页显示的条数)
db.users.find().limit(10) # 前10条数据
db.users.find().skip(50).limit(10) # 跳过前50条数据,即查询的是第61-70条数据,即第6页的数据
排序
- 注意:skip,limit,sort可以以任意的顺序调用,最终的结果都是先调sort,再调skip,最后调limit
db.emp.find().sort({sal:1}) # 1表示升序排列,-1表示降序排列
db.emp.find().sort({sal:1,empno:-1}) # 先按照sal升序排列,如果遇到相同的sal,则按empno降序排列
投影,即只过滤出自己想要的字段
# 在匹配到的文档中只显示name和age字段
db.stus.find({name:'孙悟空'},{_id:0,name:1,age:1})
修改文档
- db.<collection>.update(查询条件, 新对象) 默认情况下只改一个
- db.<collection>.updateMany(查询条件, 新对象) 同时修改多个符合条件的文档
- db.<collection>.updateOne(查询条件, 新对象) 只修改一个符合条件的文档
- db.<collection>.replaceOne 替换一个文档
# $set 修改文档的指定属性,没有就增加
db.\<collection>.update({"name":"沙和尚"},{$set:{gender:"男"}}) # 只修改一个匹配的
db.\<collection>.update({"name":"沙和尚"},{$set:{gender:"男"}},{multi: true}) # 修改多个匹配的
# $unset 删除文档的指定属性
db.\<collection>.update({"name":"沙和尚"},{$unset:{gender:"男"}})
# 其它
db.user.update({"name":"小明"},{"name":"大明","age":16}); # 查找name为小明的用户的信息进行完整替换,注意没有$set了;
db.user.update({name: 'Lisi'}, {$inc: {age: 50}}, false, true); # 查找name为Lisi的用户,将其年龄增加50岁;
删除文档
- db.<collection>.remove() 根据条件删除,注意:若只传入一个空集合,则会删除所有数据
- db.<collection>.deleteOne() 删除一个
- db.<collection>.deleteMany() 删除多个
remove 和 delete 的区别:remove 函数返回的删除的结果的 WriteResult,而 delete 函数返回的是 bson 格式。
db.stus.remove({_id:"hello"})
db.user.remove({"age":"32"},{justOne:true}) # 删除年龄为32的一个用户
去重
db.user.distinct("name"); # 查询当前集合中的某列去重后的数据
文档间的关系
一对多
# 用户与订单:
db.users.insert([{_id:100,username:'liu1'},{_id:101,username:'liu2'}])
db.orders.insert([{list:['apple','banana'],user_id:100},{list:['apple','banana2'],user_id:100},{list:['apple'],user_id:101}])
# 查询liu1的所有订单,首先获取liu1的id,根据id从订单集合中查询对应的订单
var user_id = db.users.findOne({username:'liu1'})._id;
db.orders.find({user_id:user_id});
多对多
#老师与学生
db.teachers.insert([{_id:100,name:'liu1'},{_id:101,name:'liu2'},{_id:102,name:'liu3'}])
db.students.insert([{_id:1000,name:'xiao',tech_ids:[100,101]},{_id:1001,name:'xiao2',tech_ids:[102]}])
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了