MongoDB数据库
在最近的项目中,我发现需要大量用到数据库,我们之前学到过MySQL数据库,但是在学习的过程中我发现另一种数据库更适合我的项目
文章目录
- 前言
- 一、MongoDB数据库简介
- 1. 什么是MongoDB
- 2. MongoDB的三个核心概念
- 3. MongoDB数据库的优点
- 4. 什么时候适合用MongoDB
- 二、安装MongoDB
- 三、基础命令
- 四、集合命令
- 不手动创建集合:向尚不存在的集合中第一次加入数据的时候,集合就会被创建出来
- 手动创建集合
- 查看集合:show collections
- 删除集合:db.集合名称.drop()
- 五、数据类型
- 六、插入数据
- 实例示范
- 七、简单查询数据
- 在MongoDB中提供了一系列操作符,放在条件对象里面使用
- 八、修改数据
- 总结
前言
在最近的项目中,我发现需要大量用到数据库,我们之前学到过MySQL数据库,但是在学习的过程中我发现另一种数据库更适合我的项目,那就是MongoDB数据库。
一、MongoDB数据库简介
1. 什么是MongoDB
MongoDB 是一个面向文档(document-oriented)的 NoSQL 数据库, 用 BSON(二进制 JSON)格式保存“文档”(类似 JSON 的结构),简单理解MongoDB这个数据库中存的是各种各样的JSON。它对文档的要求比关系型数据库宽松,适合快速迭代的使用。
MongoDB数据库的优点就是灵活的数据模型,强大的查询能力,优秀的扩展性。他是为了快速开发互联网web应用而设计的。
2. MongoDB的三个核心概念
- 文档 :类似 JSON 的键值对集合,支持嵌套对象与数组。
- 集合:可以储存文档, 类似于关系数据库的表。
- BSON:是二进制JSON,在MongoDB中负责存储文档以及进行网络运输,它相较于JSON支持更多数据类型,比如日期数据,二进制数据。
3. MongoDB数据库的优点
- 灵活的文档模型:每个文档的结构可以不同,无需预先严格定义严格的表结构,这一点是优于关系型数据库的。
- 强大的查询语言:MongoDB数据库中提供了全面的查询操作符,这是非常便利的
- 高性能:嵌入式数据模型—可以把经常需要一起查询的数据嵌入同一个文档,这大大提升了读取性能。而且支持索引,可以极大优化查询速度。
4. 什么时候适合用MongoDB
-
模式经常变化、快速迭代的产品原型或互联网产品。
-
JSON 文档为主要数据表示,且读取操作以文档为单位。
-
需要简单水平扩展与高写入吞吐。因为MongoDB数据库有一个机制叫分片,就是把一整个集合(Collection)按“分片键”(Shard Key)拆分成多个部分,分散存储在多个节点(分片)上。
二、安装MongoDB
csdn上有具体教程,可以搜索查询
三、基础命令
- 查看所有的数据库:show dbs /show databases
- 切换数据库:use db_name
- 查看使用当前的数据库:db
- 删除当前的数据库:db.dropDatabase()
- 查看数据库中所有集合(表):show collections
- 查看指定集合下所有文档(JSON数据):db.集合名称.find()
四、集合命令
不手动创建集合:向尚不存在的集合中第一次加入数据的时候,集合就会被创建出来
实例代码:
db.users.insertOne({ name: "张三", age: 25 });
手动创建集合
- db.createCollection(name,options)
实例代码:
db.createCollection("users")
//这里创造了一个空集合user
-
db.createCollection(“stu”)
-
db.createCollection(“sub”, { capped : true, size : 10 } )
后俩种是带参数的创建集合,创建出来的集合会符合我们的预期要求。
查看集合:show collections
删除集合:db.集合名称.drop()
五、数据类型
与常用的数据类型,我们需要注意的就是四个特殊的
- Object ID: 文档ID,每个文档都有id,保证每一个文档的唯一性,可以自己设置,也可以使用MongoDB提供的。
- integer:整数,可以是32位或64位
- Double:浮点数
- Data:类似于时间戳
六、插入数据
-
db.集合名称.insert(JSON对象)
-
插入1条数据:db.集合名称.insertOne(JSON对象)
db.users.insertOne({name: "张三",age: 25,city: "上海"
})
- 插入多条数据:db.集合名称.insertMany([JSON 1,JSON 2,JSON 3,…JSON n])
db.users.insertMany([{ name: "李四", age: 30, city: "北京" },{ name: "王五", age: 22, city: "广州" },{ name: "赵六", age: 27, city: "深圳" }
])
- 指定_id参数:db.集合名称.insert({_id:“001”, name:“gj”, gender:1})
db.users.insertOne({_id: "u1001",name: "小明",age: 18
})
如果 _id 重复,MongoDB 会报错(因为它必须唯一)。
插入数据的时候不用专门创建集合,因为插入数据时自动创建集合。
实例示范
比如我的项目是健康管理系统,我想在数据库里面记录用户的运动情况,可以每日记录用户的运动步数
db.healthData.insertOne({userId: "u001",date: new Date("2025-10-28"),steps: 12345,calories: 340,sleepHours: 7.5
})
也可以一次插入多天记录
db.healthData.insertMany([{ userId: "u001", date: new Date("2025-10-27"), steps: 9800, sleepHours: 6.9 },{ userId: "u001", date: new Date("2025-10-28"), steps: 12345, sleepHours: 7.5 }
])
七、简单查询数据
在MongoDB数据库里面,查询语法通常是
db.集合名.find(查询条件, 投影)
- 查询条件:决定找哪些文档。
- 投影:决定显示哪些字段。
- 如果没有查询条件和投影将输出文档内的所有内容。我们可以通过查询条件和投影来查找自己需要的数据
在MongoDB中提供了一系列操作符,放在条件对象里面使用
| 操作符 | 含义 | 示例 |
|---|---|---|
$gt | 大于 | { age: { $gt: 25 } } |
$gte | 大于等于 | { age: { $gte: 25 } } |
$lt | 小于 | { age: { $lt: 30 } } |
$lte | 小于等于 | { age: { $lte: 30 } } |
$ne | 不等于 | { city: { $ne: "上海" } } |
$in | 在集合中 | { city: { $in: ["上海", "北京"] } } |
$nin | 不在集合中 | { age: { $nin: [18, 20] } } |
$and | 并且 | { $and: [{ age: { $gt: 20 } }, { city: "上海" }] } |
$or | 或者 | { $or: [{ city: "北京" }, { city: "上海" }] } |
$regex | 正则匹配 | { name: { $regex: "^张" } } |
| 实例代码: |
db.users.find({ age: { $gte: 25, $lte: 30 } })
//年龄在25~30岁之间的用户
db.users.find({}, { name: 1, city: 1, _id: 0 })
//只显示name和city字段,不显示_id字段
关于查询数据的方法还有很多,可以在文档里面查询学习。
八、修改数据
MongoDB 修改数据主要用三个方法:
- updateOne():修改一条数据
db.users.updateOne({ name: "张三" }, { $set: { age: 26 } })
- updateMany():修改多条数据
db.users.updateMany({ city: "上海" }, { $set: { vip: true } })
- replaceOne():替换整个文档
db.users.replaceOne({ name: "张三" }, { name: "张三", age: 30 })
遵循一条口诀:如果有就更新,如果没有就创建
而在修改数据的时候,更新操作符是非常关键的,这决定对目标数据做出怎样的修改。
| 操作符 | 作用 | 示例 |
|---|---|---|
$set | 设置字段值(常用) | { $set: { age: 30 } } |
$unset | 删除字段 | { $unset: { age: "" } } |
$inc | 自增/自减 | { $inc: { steps: 1000 } } |
$mul | 乘法更新 | { $mul: { price: 1.1 } } |
$rename | 重命名字段 | { $rename: { oldName: "newName" } } |
$currentDate | 设置当前日期 | { $currentDate: { updatedAt: true } } |
$min | 若新值更小则更新 | { $min: { score: 80 } } |
$max | 若新值更大则更新 | { $max: { score: 90 } } |
$push | 往数组添加元素 | { $push: { logs: "2025-10-28" } } |
$pull | 从数组移除元素 | { $pull: { tags: "已完成" } } |
实例使用:
比如我们有一个healthData 集合记录用户当天的健康状况:
{userId: "u001",date: "2025-10-28",steps: 8000,sleepHours: 7
}
- 更新今日步数
db.healthData.updateOne({ userId: "u001", date: "2025-10-28" },{ $set: { steps: 9500 } }
)
- 记录步数增加
db.healthData.updateOne({ userId: "u001", date: "2025-10-28" },{ $inc: { steps: 500 } }
)
总结
MongoDB数据库在合适的地方有奇妙的效果,我们可以了解并用到项目里面。
