1. MongoDB概述
MongoDB 是一个基于分布式文件存储的开源数据库系统,是当前最热门的NoSQL数据库之一。它将数据存储为 BSON(一种类JSON格式的二进制形式)格式,支持动态查询,可以使用聚合,索引, MapReduce 和复制等功能.
1.1 NoSQL数据库
NoSQL是一个泛指非关系型的数据库,它的出现是为了解决关系型数据库在大规模数据存储和高并发读写场景下的负载问题。NoSQL数据库通常设计的更加灵活,能够支持非结构性数据,但由于NoSQL没有统一的标准,不同的NoSQL数据库的功能和特点也不尽相同。
1.2 MongoDB的优势
MongoDB具有以下几个优势:
易于扩展:因为MongoDB能够支持分布式数据库,支持NoSQL特性,支持数据切分和负载均衡等功能,从而使得增加更多的节点一次查询时间将不会变化,因此可以方便的扩展数据规模。
数据的模型自由: 因为MongoDB采用的是类似 JSON 格式的 BSON 数据存储格式,在存储时不需要事先定义数据模型或者字段类型,可以方便的在修改数据结构。
高效:MongoDB 采用了 C++ 语言作为底层实现,运行稳定,读写性能高。
2. MongoDB的核心概念
2.1 数据库(Database)
在 MongoDB 中,数据库可以认为是由若干个集合构成一个逻辑上的容器。一个 MongoDB server 可以包含多个独立的数据库。
2.2 集合(Collection)
MongoDB 中,逻辑数据库包含多个集合,一个集合对应着一个表。集合与表的相关概念一致, 都是一些列具有相同类型的数据的集合,每个文档都是一个这个集合的唯一对象,MongoDB 通过集合来组织文档并提供了相应文档的 CRUD 操作。
2.3 文档(Document)
MongoDB 的存储单位是文档(Document). 一个文档相当于关系型数据库中的一行数据记录, 它是 MongoDB 数据库中最基本的存储单元,逻辑上相当于一个 JSON 对象,格式如下:
{
"name": "张三",
"age": "22",
"address": "河南省郑州市"
}
MongoDB的一个文档可以是非常复杂的,甚至可以嵌套文档或者数组:
{
"title": "MongoDB入门指南",
"author": {
"name": "张三",
"age": "30"
},
"tags": ["NoSQL", "MongoDB", "Database"],
"comments":[
{
"user":"joe",
"comment":"这是个好文章",
"time":ISODate("2019-09-01T00:00:00Z")
},
{
"user":"john",
"comment":"好文!",
"time":ISODate("2020-01-01T00:00:00Z")
}
]
}
2.4 字段(Field)
文档中的每个属性称为一个字段。MongoDB 是一个动态Schema的数据库,也就是说,即使在一个集合里面,不同的文档结构也可能是不同的。
2.5 主键(Primary Key)
每个 MongoDB 的文档都必须有一个 "_id" 字段,相当于关系型数据库中的主键。该字段是唯一的,标识着文档的唯一性。如果一个文档没有设置 _id值,MongoDB会自动为该文档添加一个 _id 属性,并生成一个唯一的 ObjectId 类型的值作为该文档的 _id 值。
2.6 索引(Index)
索引是MongoDB支持的一种高效数据查询方式,类似于关系型数据库中的索引,可用于提高查询效率。在MongoDB中,索引可以通过db.collection.createIndex()方法创建。一个集合中可以创建多个索引。
2.7 会话(Session)
会话事务是MongoDB 4.0 中引入的重要特性,其实现了分布式的 ACID 事务特性,MongoDB通过会话事务来保证多个数据操作的原子性、一致性、隔离性和持久性。
3. MongoDB基本操作指令
3.1 数据库操作
使用show dbs查看所有数据库
show dbs
使用use db_name创建或选择数据库
use my_mongodb
使用db.drop_database()删除当前数据库
use my_mongodb
db.dropDatabase()
3.2 集合操作
创建集合
db.createCollection(name, options)
其中,name 是集合名称,options 是一个包含可选参数的文档。
插入文档
db.collection.insert(document)
其中,collection是指定集合,document是要插入文档。
查询文档
db.collection.find(query, projection)
其中,query是查询条件,可以省略表示查询所有记录;projection指定返回的文档字段,可以省略表示返回所有字段。
更新文档
db.collection.update(query, update, options)
其中,query是查询更新条件,update是被更新的内容,options是更新参数,可以省略。
删除文档
db.collection.remove(query, single)
其中,query是查询删除条件,single指定删除匹配到的所有文档(默认值为false)。
3.3 聚合操作
聚合操作是 MongoDB 对多个文档进行计算的一种数据处理方式,通过聚合操作,可以实现比单一文档限制更多的数据处理场景。通常,聚合操作将输入文档转换成一组输出文档,每个输出文档可以是聚合管道中的同一个输入文档的更改版本,或者是完全新的文档。
聚合管道
MongoDB支持Aggregation Pipeline,即聚合管道,这个管道是由多个阶段阶段组成的。一个阶段接受输入然后输出结果到下一个阶段的管道中。聚合管道支持的阶段包括:$match、$sort、$group、$skip、$limit、$lookup、$unwind 等。
db.collection.aggregate(pipeline)
其中,pipeline是MongoDB聚合管道的阶段,可以是多个阶段。
3.4 索引操作
MongoDB提供了命令来创建、更新和删除索引:
创建索引
db.collection.createIndex(keys, options)
其中,keys为索引键值,options是其他可选参数。
删除索引
db.collection.dropIndex(index)
其中,index是要删除的索引名称。
3.5 会话事务操作
MongoDB 4.0 中引入了会话事务操作,来保证多个数据操作的原子性、一致性、隔离性和持久性,通过以下代码实现会话创建、会话事务开始、操作、提交/回滚等:
session = client.start_session() # 创建会话
session.start_transaction() # 开始事务
try:
db.collection.insert_one(document, session=session)
db.collection.updateOne(query, update, session=session)
session.commit_transaction() # 提交事务
except Exception as e:
session.abort_transaction() # 回滚事务
raise e
finally:
session.end_session() # 释放会话
总结
本文主要介绍了 MongoDB 的概念和核心操作指令,MongoDB拥有很多的优势,例如易于扩展、数据的模型自由、高效等,能够更好地满足当前大规模数据存储和高并发读写的需求。在开发过程中,需要根据具体需求灵活选择使用MongoDB的基本操作指令和高级操作方式来实现相应业务逻辑。