非关系型数据库(1)---MongoDB
目录
1.MongoDB
1.MongoDB的特点
2.MongoDB的应用场景
3.MongoDB与MySQL的比较
2.数据库操作
1. 创建数据库
2. 切换数据库
3. 查看所有数据库
4. 查看当前数据库
5. 删除数据库
6. 查看数据库统计信息
7. 备份数据库
8. 恢复数据库
9. 创建用户和授权
10. 删除用户
11. 查看用户列表
3.集合和文档操作
1. 创建集合
2. 删除集合
3. 重命名集合
4. 查看所有集合
5. 插入文档
6. 查询文档
7. 更新文档
8. 删除文档
9. 创建索引
10. 删除索引
11. 查看索引
12. 计数文档
13. distinct操作
14. aggregate聚合
15. findAndModify
16. bulkWrite
4.查询操作
基本查询操作
条件查询操作
聚合查询操作
高级查询技巧
5.SpringBoot集成MongoDB
1.MongoDB
MongoDB是一个基于文档的NoSQL数据库,它使用JSON-like的BSON格式来存储数据。MongoDB的设计旨在提供高性能、高可用性和易于扩展的特点,特别适合处理大量数据和高并发的数据访问需求。
1.MongoDB的特点
- 文档存储:数据存储在类似JSON的文档中,每个文档都可以有不同的字段和结构。
- 动态模式:不需要预先定义数据结构,可以根据需要动态添加字段。
- 高可用性:支持自动故障转移和复制集,确保数据的持久性和可用性。
- 水平扩展:通过分片技术,可以在多个服务器上分布数据,实现水平扩展。
- 丰富的查询语言:支持丰富的查询操作,包括聚合、索引、文本搜索等。
2.MongoDB的应用场景
- 大数据处理:适合处理大规模数据集,如日志分析、实时数据监控等。
- 实时应用:适用于需要快速读写操作的应用,如社交网络、实时聊天应用等。
- 内容管理:适合存储和检索非结构化数据,如博客、文章、媒体内容等。
- 物联网(IoT):处理来自大量设备的传感器数据。
3.MongoDB与MySQL的比较
- 数据模型:MySQL使用关系型数据模型,而MongoDB使用文档型数据模型。
- 查询语言:MySQL使用SQL,而MongoDB使用自己的查询语言。
- 扩展性:MongoDB支持水平扩展,而MySQL更适合垂直扩展。
- 事务处理:MySQL支持复杂的事务处理,而MongoDB在4.0版本后开始支持多文档事务。
2.数据库操作
MongoDB对数据库本身的操作
在MongoDB中,对数据库本身的操作包括创建数据库、切换数据库、删除数据库以及查看数据库信息等。以下是一些常用的命令行操作:
1. 创建数据库
在MongoDB中,数据库是通过使用use
命令切换到不存在的数据库来创建的。当你第一次存储数据时,数据库和集合会被自动创建。
use newDatabaseName
2. 切换数据库
使用use
命令可以切换到已经存在的数据库。如果数据库不存在,则会创建一个新的数据库。
use existingDatabaseName
3. 查看所有数据库
使用show dbs
命令可以查看当前MongoDB实例中的所有数据库。
show dbs
4. 查看当前数据库
使用db
命令可以查看当前操作的数据库。
db
5. 删除数据库
使用db.dropDatabase()
命令可以删除当前数据库。这个操作会删除数据库中的所有集合、文档和索引。
db.dropDatabase()
6. 查看数据库统计信息
使用db.stats()
命令可以查看当前数据库的统计信息,例如数据大小、索引大小、文档数量等。
db.stats()
7. 备份数据库
使用mongodump
工具可以备份MongoDB数据库。以下是一个基本的备份命令:
mongodump --db databaseName --out backupDirectory
8. 恢复数据库
使用mongorestore
工具可以恢复MongoDB数据库。以下是一个基本的恢复命令:
mongorestore --db databaseName backupDirectory
9. 创建用户和授权
在MongoDB中,你可以创建用户并对数据库进行授权。以下是一些基本的用户和权限管理命令:
use admin
db.createUser({
user: "username",
pwd: "password",
roles: [{ role: "readWrite", db: "databaseName" }]
})
10. 删除用户
使用db.dropUser()
命令可以删除数据库中的用户。
db.dropUser("username")
11. 查看用户列表
使用show users
命令可以查看当前数据库中的用户列表。
show users
3.集合和文档操作
1. 创建集合
使用db.createCollection()
命令可以显式创建一个集合。
db.createCollection("collectionName")
2. 删除集合
使用db.collection.drop()
命令可以删除一个集合及其所有文档。
db.collectionName.drop()
3. 重命名集合
使用db.collection.renameCollection()
命令可以重命名一个集合。
db.collectionName.renameCollection("newCollectionName")
4. 查看所有集合
使用show collections
或db.getCollectionNames()
命令可以查看当前数据库中的所有集合。
show collections
或
db.getCollectionNames()
5. 插入文档
使用db.collection.insert()
命令可以在集合中插入一个或多个文档。
db.collectionName.insert({key: "value"})
6. 查询文档
使用db.collection.find()
命令可以查询集合中的文档。
db.collectionName.find({key: "value"})
7. 更新文档
使用db.collection.update()
命令可以更新集合中的文档。
db.collectionName.update({key: "value"}, {$set: {key: "newValue"}})
8. 删除文档
使用db.collection.remove()
命令可以删除集合中的文档。
db.collectionName.remove({key: "value"})
9. 创建索引
使用db.collection.createIndex()
命令可以为集合创建索引。
db.collectionName.createIndex({key: 1})
10. 删除索引
使用db.collection.dropIndex()
命令可以删除集合中的索引。
db.collectionName.dropIndex({key: 1})
11. 查看索引
使用db.collection.getIndexes()
命令可以查看集合中的所有索引。
db.collectionName.getIndexes()
12. 计数文档
使用db.collection.count()
命令可以计算集合中的文档数量。
db.collectionName.count()
13. distinct操作
使用db.collection.distinct()
命令可以返回集合中指定键的不同值。
db.collectionName.distinct("key")
14. aggregate聚合
使用db.collection.aggregate()
命令可以进行复杂的聚合操作。
db.collectionName.aggregate([{$match: {key: "value"}}, {$group: {_id: "$key", count: {$sum: 1}} }])
15. findAndModify
使用db.collection.findAndModify()
命令可以原子性地查找并修改文档。
db.collectionName.findAndModify({
query: {key: "value"},
update: {$set: {key: "newValue"}},
new: true
})
16. bulkWrite
使用db.collection.bulkWrite()
命令可以执行批量写入操作,包括插入、更新和删除。
db.collectionName.bulkWrite([
{insertOne: {document: {key: "value"}}},
{updateOne: {filter: {key: "value"}, update: {$set: {key: "newValue"}}, upsert: true}},
{deleteOne: {filter: {key: "value"}}}
])
4.查询操作
-
基本查询操作
- 查找所有文档:使用
find()
方法可以查找集合中的所有文档。例如,db.collection.find()
。 - 查找特定文档:通过在
find()
方法中指定查询条件,可以查找满足条件的特定文档。例如,db.collection.find({ field: "value" })
。 - 返回特定字段:可以使用投影(projection)来指定返回的字段。例如,
db.collection.find({ field: "value" }, { field1: 1, field2: 1 })
。
- 查找所有文档:使用
-
条件查询操作
- 比较操作符:如
$eq
(等于)、$ne
(不等于)、$gt
(大于)等。例如,db.collection.find({ field: {$gt: 10 } })
。 - 逻辑操作符:包括
$and
、$or
、$not
和$nor
。例如,db.collection.find({ $or: [{ field1: "value1" }, { field2: "value2" }] })
。 - 元素操作符:如
$exists
和$type
,用于查询包含特定字段或类型的文档。例如,db.collection.find({ field: { $exists: true } })
。 - 数组操作符:如
$in
、$nin
、$all
,用于查询数组字段。例如,db.collection.find({ arrayField: {$in: [1, 2, 3] } })
。 - 正则表达式:用于模糊查询。例如,
db.collection.find({ field: { $regex: "pattern" } })
。
- 比较操作符:如
-
聚合查询操作
- 基本聚合管道:聚合管道由多个阶段组成,每个阶段对数据进行处理。例如,
db.collection.aggregate([ { $match: { field: "value" } }, {$group: { _id: "$field", total: {$sum: "$anotherField" } } } ])
。 - 常用聚合操作符:如
$match
、$group
、$project
、$sort
、$limit
、$skip
等。 - 聚合表达式:如
$sum
、$avg
、$min
、$max
等,用于在聚合阶段进行计算。
- 基本聚合管道:聚合管道由多个阶段组成,每个阶段对数据进行处理。例如,
-
高级查询技巧
- 使用索引:合理使用索引可以显著提高查询性能。
- 查询优化:使用
explain()
方法分析查询性能。 - 分页查询:使用
limit()
和skip()
方法进行分页查询。 - 地理空间查询:使用地理空间索引和操作符进行地理位置查询
5.SpringBoot集成MongoDB
-
保存操作:
save(T entity)
:保存单个实体。saveAll(Iterable<T> entities)
:保存多个实体。
-
查找操作:
findById(ID id)
:根据ID查找实体。findById(ID id, Class<T> type)
:根据ID查找实体,并指定返回类型。findAll()
:查找所有实体。findAll(Iterable<ID> ids)
:根据ID列表查找多个实体。findAll(Sort sort)
:查找所有实体并排序。findAll(Example<T> example)
:根据示例查找实体。findAll(Example<T> example, Sort sort)
:根据示例查找实体并排序。
-
删除操作:
deleteById(ID id)
:根据ID删除实体。delete(T entity)
:删除单个实体。deleteAll(Iterable<? extends T> entities)
:删除多个实体。deleteAll()
:删除所有实体。
-
更新操作:
save(T entity)
:保存或更新实体(如果实体已存在,则更新;如果不存在,则保存)。
-
计数操作:
count()
:计算所有实体的数量。count(Example<T> example)
:根据示例计算实体的数量。
-
存在性检查:
existsById(ID id)
:检查ID对应的实体是否存在。
-
自定义查询:
- 可以通过在
MongoRepository
接口中定义方法并使用MongoDB的查询注解(如@Query
)来执行自定义查询。
- 可以通过在
-
分页和排序:
findAll(Pageable pageable)
:分页查询所有实体。findAll(Sort sort)
:排序查询所有实体。
-
聚合操作:
- 使用
Aggregation
类来执行复杂的聚合操作,如分组、过滤、转换等。
- 使用
-
地理空间操作:
- 如果实体包含地理空间数据,可以使用地理空间查询方法,如
near
、within
等。
- 如果实体包含地理空间数据,可以使用地理空间查询方法,如
-
事务管理:
- 使用
@Transactional
注解来管理事务。
- 使用
-
索引管理:
- 使用
@Indexed
注解来定义索引。
- 使用