1. 什么是MongoDB?
MongoDB是一个开源的、强大的、高性能的NoSQL数据库。与传统的关系型数据库不同,MongoDB使用文档模型存储数据,其文档可以是数组、嵌套文档或其他类型的数据,开发者可以将MongoDB看作一个面向文档存储的数据平台。
下面是一段MongoDB文档样例:
{
"_id": ObjectId("5f5c904fe2fc8e2ebcb3ec56"),
"name": "Tom",
"age": 25,
"gender": "male",
"email": "tom@example.com",
"hobbies": ["reading", "swimming", "traveling"],
"address": {
"province": "Guangdong",
"city": "Shenzhen",
"district": "Futian",
"street": "Xinzhou",
"zip_code": "518057"
}
}
1.1 为什么要使用MongoDB?
相比于传统的关系型数据库,MongoDB有以下优势:
高度伸缩性:支持分布式、横向扩展,并能在集群中自动进行负载均衡,能够轻松应对高并发访问。
灵活性:支持多种数据结构,数据之间可以进行嵌套、关联,不受外键、表大小等限制。开发过程中不必在频繁的建模和维护相互关联的关系。
性能优化能力:使用内存映射技术,将频繁使用的数据存储在内存中,同时提供了丰富的工具来存储和查询数据。因此,MongoDB的查询性能通常比关系型数据库更优秀。
易于部署:支持易于部署和管理的自动化部署流程。可以在多种不同的平台上部署和运行,包括物理机器、虚拟机、容器、公有云、私有云等。
1.2 MongoDB与关系型数据库的区别
与传统的关系型数据库不同,MongoDB具有以下特点:
数据存储:关系型数据库使用表格来保存数据,而MongoDB使用BSON文档来保存数据。
可扩展性:关系型数据库使用分区和主从复制来支持可扩展性,MongoDB使用分片和副本集来支持可扩展性。
模式灵活:关系型数据库需要在先定义表和字段,而MongoDB不需要,它可以使用动态和嵌套的文档结构。
2. MongoDB的基本概念
2.1 数据库(Database)
数据库(Database)是MongoDB中最高级别的数据容器,可以在一个MongoDB实例中创建多个数据库。MongoDB中,数据库采用延迟分配机制,只有在该数据库第一次被使用时才会创建。
2.2 集合(Collection)
集合(Collection)是一组文档的容器,类似于关系型数据库中的表格。它是MongoDB中基本的数据组织形式之一,可以存储在一个数据库中,但不需要提前创建。当向一个不存在的集合中存储文档时,MongoDB会自动创建该集合。
2.3 文档(Document)
文档(Document)是MongoDB中存储数据的基本单位。它采用BSON格式(Binary JSON)进行存储,可以包含多个字段、嵌套等复杂结构。文档可以看作数据库中的一行记录,但是在BSON格式中,它包含了更多的内容和信息。
2.4 字段(Field)
字段(Field)是文档中的最小单位,表示一个属性或一个数据元素。字段具有名字和值,MongoDB中的值可以是纯量(比如数字、字符串等),也可以是嵌套的文档或者数组。
3. MongoDB的CURD操作
3.1 插入数据
在MongoDB中,我们可以使用insertOne()
和insertMany()
方法向集合中插入数据,下面是一些示例:
// 插入单个文档
db.students.insertOne({
"name": "Tom",
"age": 18,
"gender": "male"
})
// 插入多个文档
db.students.insertMany([
{
"name": "Lucy",
"age": 17,
"gender": "female"
},
{
"name": "Jack",
"age": 20,
"gender": "male"
}
])
3.2 查询数据
在MongoDB中,我们可以使用find()
方法来查询数据。它返回查询结果集,并可以根据需要进行过滤、排序、分页等操作。下面是一些示例:
// 查询所有文档
db.students.find()
// 条件查询
db.students.find({"name": "Tom"})
// 带条件和投影的查询
db.students.find({"age": {"$lt": 18}}, {"name": 1, "_id": 0})
3.3 更新数据
在MongoDB中,我们可以使用updateOne()
和updateMany()
方法更新数据。
// 更新单个文档
db.students.updateOne({"name": "Tom"}, {"$set":{"age": 19}})
// 更新多个文档
db.students.updateMany({"gender": "male"}, {"$set":{"age": 21}})
3.4 删除数据
在MongoDB中,我们可以使用deleteOne()
和deleteMany()
方法删除数据。
// 删除单个文档
db.students.deleteOne({"name": "Tom"})
// 删除多个文档
db.students.deleteMany({"age": {"$gt": 20}})
4. MongoDB的索引
索引(Index)是一种协助查询的数据结构,它可以有效地提高查询性能。在MongoDB中,我们可以使用createIndex()
方法在集合上创建索引。
// 在students集合上创建age字段的索引
db.students.createIndex({"age": 1})
5. MongoDB的聚合操作
在MongoDB中,我们可以使用aggregate()
方法实现复杂的数据处理操作,如分组、筛选、计算等。
// 对students集合按照性别分组,并计算每组的平均年龄
db.students.aggregate([
{"$group": {"_id": "$gender", "avg_age": {"$avg": "$age"}}}
])
6. MongoDB的备份和恢复
在MongoDB中,我们可以使用mongodump
和mongorestore
命令来进行备份和恢复。
// 备份students集合到students.bson文件
mongodump --collection students --db test --out /backup
// 恢复students.bson文件到students集合
mongorestore --collection students --db test /backup/test/students.bson
7. MongoDB的安全性
在MongoDB中,我们可以使用user
和role
来实现访问控制。它提供了基于角色的访问控制,并且支持加密存储和TLS/SSL加密传输。
总结
本文介绍了MongoDB的基本概念、CURD操作、索引、聚合操作、备份和恢复以及安全性等内容。通过本文的学习,读者已经具备了使用MongoDB进行数据存储和处理的基本能力。