MongoDB基础使用

什么是MongoDB

MongoDB是一个NoSQL的非关系型数据库,支持海量数据存储,高性能读写。

在使用过程中,需要搞清楚MongoDB的体系结构:

  1. Mongo中的集合相当于MySQL中的

  2. Mongo中的文档相当于MySQL中的

  3. Mongo中的相当于MySQL中的字段/列

Mongo与MySQL、Redis对比:
特性/维度 MySQL MongoDB Redis
数据模型 关系型数据库,使用预定义的表、行、列;数据模式固定 文档型数据库,采用 BSON/JSON 格式,模式灵活,无需事先定义 Schema 键值型数据库,支持字符串、哈希、列表、集合、有序集合等多种数据结构
存储方式 数据存储在硬盘上,依赖索引与缓存优化查询 结合内存映射与磁盘存储,常将热点数据加载到内存中;支持分片和副本集 数据主要存储在内存中,通过 RDB/AOF 方式实现持久化,适合高速读写
性能与扩展性 性能稳定,复杂查询表现优异,但水平扩展较为复杂 高扩展性,适合大数据量场景,支持自动分片,能快速响应热点数据 响应速度极快,适合高并发场景;扩展依赖内存容量,支持集群分片管理
事务与数据一致性 完整支持 ACID 事务,保证强一致性 近期开始支持多文档事务,但跨分片时可能采用最终一致性模型 仅支持简单事务(MULTI/EXEC),不支持回滚,主要用于缓存及非关键场景
适用场景 适用于结构化数据存储、复杂关联查询及对数据一致性要求较高的系统(如金融、ERP) 适用于非结构化或半结构化数据、大数据量、内容管理和日志存储等互联网应用 适用于缓存、会话管理、排行榜、消息队列和实时数据处理等对速度要求极高的场景

Docker安装MongoDB

  1. 拉去镜像

    docker pull mongo
  2. 创建容器

    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_USERNAMEMONGO_INITDB_ROOT_PASSWORD是初始的用户名密码

  1. 连接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