MongoDB基础使用
什么是MongoDB
MongoDB是一个NoSQL的非关系型数据库,支持海量数据存储,高性能读写。
在使用过程中,需要搞清楚MongoDB的体系结构:
Mongo中的集合相当于MySQL中的表
Mongo中的文档相当于MySQL中的行
Mongo中的域相当于MySQL中的字段/列
Mongo与MySQL、Redis对比:
特性/维度 | MySQL | MongoDB | Redis |
---|---|---|---|
数据模型 | 关系型数据库,使用预定义的表、行、列;数据模式固定 | 文档型数据库,采用 BSON/JSON 格式,模式灵活,无需事先定义 Schema | 键值型数据库,支持字符串、哈希、列表、集合、有序集合等多种数据结构 |
存储方式 | 数据存储在硬盘上,依赖索引与缓存优化查询 | 结合内存映射与磁盘存储,常将热点数据加载到内存中;支持分片和副本集 | 数据主要存储在内存中,通过 RDB/AOF 方式实现持久化,适合高速读写 |
性能与扩展性 | 性能稳定,复杂查询表现优异,但水平扩展较为复杂 | 高扩展性,适合大数据量场景,支持自动分片,能快速响应热点数据 | 响应速度极快,适合高并发场景;扩展依赖内存容量,支持集群分片管理 |
事务与数据一致性 | 完整支持 ACID 事务,保证强一致性 | 近期开始支持多文档事务,但跨分片时可能采用最终一致性模型 | 仅支持简单事务(MULTI/EXEC),不支持回滚,主要用于缓存及非关键场景 |
适用场景 | 适用于结构化数据存储、复杂关联查询及对数据一致性要求较高的系统(如金融、ERP) | 适用于非结构化或半结构化数据、大数据量、内容管理和日志存储等互联网应用 | 适用于缓存、会话管理、排行榜、消息队列和实时数据处理等对速度要求极高的场景 |
Docker安装MongoDB
拉去镜像
docker pull mongo
创建容器
docker run --restart=always --name mongo \ -p 27017:27017 \ -e TZ=Asia/Shanghai \ -v /data/mongo/data:/data/db \ -v /data/mongo/log:/data/log \ --privileged=true \ -e MONGO_INITDB_ROOT_USERNAME=mongo \ -e MONGO_INITDB_ROOT_PASSWORD=mongo \ -d mongo
PS:MONGO_INITDB_ROOT_USERNAME
和MONGO_INITDB_ROOT_PASSWORD
是初始的用户名密码
- 连接MongoDB连接MongoDB除了可以用官网提供的GUI工具,还可以使用VsCode插件进行连接,在VsCode插件库中搜索
MongoDB for VS Code
安装,然后输入连接地址即可。如果你选择使用VsCode连接Mongo,你可以使用JavaScript的形式来操作数据库,但是无法直接使用Shell,还是需要下载MongoSh
MongoDB基础使用
--查看当前数据库
show databases
show dbs
--切换数据库
use 数据库名
PS:use
可以使用一个并不存在的数据库,这是MongoDB的特点,当插入数据时,如果数据库不存在,会自动创建
--插入数据
db.users.insertOne({name: "laoyang"})
db.users.insertOne({name: "zhangsan", age: 18})
db.users.insertMany([{name: "lisi"},{name: "wangwu"}])
acknowledged
表述是否插入成功
insertedId
数据全局唯一ID
插入的数据字段不一定要相同符合
--查寻全部数据
db.users.find()
--只查询一条数据
db.users.find().limit(1)
--查询条件,查询level为3的数据,这里要注意level为数字,如果你传入字符串则查询失败
db.users.find({level: 3})
--设置返回字段,查询时只返回name和email,如果设置为0 则不返回字段
db.users.find({level: 3},{name: 1, email: 1}})
--查询level大于3的数据
db.users.find({level: {$gt: 3}})
--类似于Sql中的in
db.users.find({level: {$in: [1,3}})
--查询存在email字段的数据,也可以传入1表示true 0表示false
--注意:$exists只能判断字段是否存在,不能用于字段中的值是否存在
db.users.find({email: {$exists: true}})
--查询level大于等于3和小于等于5的数据,Sql中的And,两个语句同样的效果
db.users.find({level: {$gte: 3, $lte: 5}})
db.users.find({$and: [{level: {$gte: 3}}, {level: {$lte: 5}}]})
--类似于Sql中的or
db.users.find({$or: [{level: {$gte: 3}}, {level: {$lte: 5}}]})
--查询level不为3的数据
db.users.find({level: {$not: {$eq: 3}}})
--用正则表达式查询,带'张'的数据,$options表述忽略大小写
db.users.find({name: {$regex: /张/}})
db.users.find({name: {$regex: /张/, $options: 'i'}})
--查询第一条数据
db.users.findOne({level: {$gte: 3}})
--查询排序,根据level字段排序,1是升序,-1是降序
db.users.find().sort({level: 1})
db.users.find().sort({level: 1,name: -1})
--skip用于跳过数据,跳过了第一条
db.users.find().sort({level: 1}).skip(1)
--更新level为1的第一条数据,如果money不存在,则直接插入
db.users.updateOne({level: 1},$set: {{money: 100}})
--更新多条数据
db.users.updateMany({level: 1},$set: {{money: 100}})
--删除level为1的第一条数据
db.users.deleteOne({level: 1})
--删除level为1的多条数据
db.users.deleteMany({level: 1})
聚合
--查询users表的数据行数,里面参数和find类似
db.users.countDocuments()
db.users.countDocuments({level: {$gte: 3}})
常见查询条件
中文 | 符号 |
---|---|
小于 | $lt |
大于 | $gt |
小于或等于 | $lte |
大于或等于 | $gte |
不等于 | $ne |