MongoDB
MongoDB是一款强大、灵活、且易于扩展的通用型数据库。
1、易用性
MongoDB是一个面向文档(document-oriented)的数据库,而不是关系型数据库。
不采用关系型主要是为了获得更好得扩展性。当然还有一些其他好处,与关系数据库相比,面向文档的数据库不再有“行“(row)的概念取而代之的是更为灵活的“文档”(document)模型。
通过在文档中嵌入文档和数组,面向文档的方法能够仅使用一条记录来表现复杂的层级关系,这与现代的面向对象语言的开发者对数据的看法一致。
另外,不再有预定义模式(predefined schema):文档的键(key)和值(value)不再是固定的类型和大小。由于没有固定的模式,根据需要添加或删除字段变得更容易了。通常由于开发者能够进行快速迭代,所以开发进程得以加快。而且,实验更容易进行。开发者能尝试大量的数据模型,从中选一个最好的。
2、易扩展性
应用程序数据集的大小正在以不可思议的速度增长。随着可用带宽的增长和存储器价格的下降,即使是一个小规模的应用程序,需要存储的数据量也可能大的惊人,甚至超出
了很多数据库的处理能力。过去非常罕见的T级数据,现在已经是司空见惯了。
由于需要存储的数据量不断增长,开发者面临一个问题:应该如何扩展数据库,分为纵向扩展和横向扩展,纵向扩展是最省力的做法,但缺点是大型机一般都非常贵,而且
当数据量达到机器的物理极限时,花再多的钱也买不到更强的机器了,此时选择横向扩展更为合适,但横向扩展带来的另外一个问题就是需要管理的机器太多。
MongoDB的设计采用横向扩展。面向文档的数据模型使它能很容易地在多台服务器之间进行数据分割。MongoDB能够自动处理跨集群的数据和负载,自动重新分配文档,以及将
用户的请求路由到正确的机器上。这样,开发者能够集中精力编写应用程序,而不需要考虑如何扩展的问题。如果一个集群需要更大的容量,只需要向集群添加新服务器,MongoDB就会自动将现有的数据向新服务器传送
3、丰富的功能
MongoDB作为一款通用型数据库,除了能够创建、读取、更新和删除数据之外,还提供了一系列不断扩展的独特功能
#1、索引
支持通用二级索引,允许多种快速查询,且提供唯一索引、复合索引、地理空间索引、全文索引
#2、聚合
支持聚合管道,用户能通过简单的片段创建复杂的集合,并通过数据库自动优化
#3、特殊的集合类型
支持存在时间有限的集合,适用于那些将在某个时刻过期的数据,如会话session。类似地,MongoDB也支持固定大小的集合,用于保存近期数据,如日志
#4、文件存储
支持一种非常易用的协议,用于存储大文件和文件元数据。MongoDB并不具备一些在关系型数据库中很普遍的功能,如链接join和复杂的多行事务。省略
这些的功能是处于架构上的考虑,或者说为了得到更好的扩展性,因为在分布式系统中这两个功能难以高效地实现
4、卓越的性能
MongoDB的一个主要目标是提供卓越的性能,这很大程度上决定了MongoDB的设计。MongoDB把尽可能多的内存用作缓存cache,视图为每次查询自动选择正确的索引。
总之各方面的设计都旨在保持它的高性能
虽然MongoDB非常强大并试图保留关系型数据库的很多特性,但它并不追求具备关系型数据库的所有功能。只要有可能,数据库服务器就会将处理逻辑交给客户端。这种精
简方式的设计是MongoDB能够实现如此高性能的原因之一
MongoDB基础知识
从上面的图中可以看出,集合就相当于关系型数据库的表,文档就是记录等等
需要注意的是:
#1、文档中的键/值对是有序的。
#2、文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
#3、MongoDB区分类型和大小写。
#4、MongoDB的文档不能有重复的键。
#5、文档中的值可以是多种不同的数据类型,也可以是一个完整的内嵌文档。文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。
文档键命名规范:
#1、键不能含有 (空字符)。这个字符用来表示键的结尾。
#2、.和$有特别的意义,只有在特定环境下才能使用。
#3、以下划线"_"开头的键是保留的(不是严格要求的)。
集合就是一组文档。如果将MongoDB中的一个文档比喻为关系型数据的一行,那么一个集合就相当于是一张表。
#1、集合存在于数据库中,通常情况下为了方便管理,不同格式和类型的数据应该插入到不同的集合,但其实集合没有固定的结构,这意味着我们完全可以把不同格式和类型的数据统统插入一个集合中。
#2、组织子集合的方式就是使用“.”,分隔不同命名空间的子集合。
比如一个具有博客功能的应用可能包含两个集合,分别是blog.posts和blog.authors,这是为了使组织结构更清晰,这里的blog集合(这个集合甚至不需要存在)跟它的两个子集合没有任何关系。
在MongoDB中,使用子集合来组织数据非常高效,值得推荐
#3、当第一个文档插入时,集合就会被创建。合法的集合名:
集合名不能是空字符串""。
集合名不能含有 字符(空字符),这个字符表示集合名的结尾。
集合名不能以"system."开头,这是为系统集合保留的前缀。
用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。
数据库:在MongoDB中,多个文档组成集合,多个集合可以组成数据库
数据库也通过名字来标识。数据库名可以是满足以下条件的任意UTF-8字符串:
#1、不能是空字符串("")。
#2、不得含有' '(空格)、.、$、/、和 (空字符)。
#3、应全部小写。
#4、最多64字节。
有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。
#1、admin: 从身份认证的角度讲,这是“root”数据库,如果将一个用户添加到admin数据库,这个用户将自动获得所有数据库的权限。再者,一些特定的服务器端命令也只能从admin数据库运行,如列出所有数据库或关闭服务器
#2、local: 这个数据库永远都不可以复制,且一台服务器上的所有本地集合都可以存储在这个数据库中
#3、config: MongoDB用于分片设置时,分片信息会存储在config数据库中
操作数据库
mongodb: (可以永久保存数据)
- 库
- 启动服务端: mongod
- 启动客户端: mongo
- db.help()
- 查看库下的所有方法
- db(*******): 查看当前库
- db ---> test
db ----> 相当于拿到了一个对象
- show dbs: 查看所有库
- 注意: 只显示有数据的库
- admin
- local
- use: 切换库
******* 注意: 切换库,若没有,则创建!
- use admin
- db ---> admin
- db tank ---> 原本没有tank库,则创建
- tank库是空的
- 删除库:
- mongodb:
db.dropDatabase()
- mysql:
drop db;
- 集合:Mongodb在查询集合时,若集合不存在,则创建,无需事先设计集合有哪些属性;
- db.user2.help()
- 查看集合下的所有方法
{
key1:"",
key2: {
}
}
- 增
db.user_col.insert(
{'username': 'tank'}
)
- 查
注意: 集合中必须有数据才能查看,否则等于无;
- show collections: 查看所有集合
- show tables;
- 删
db.user_col.drop()
- 文档:
- 插入:
- 插入单条
user0 = {
"name":"egon",
"age":10,
'hobbies':['music','read','dancing'],
'addr':{
'country':'China',
'city':'BJ'
}
}
# 插入数据
db.user1.insert(user0)
# 查询user1集合中的所有数据
db.user1.find()
- 插入多条
user1 = {
"_id":1,
"name":"alex",
"age":10,
'hobbies':['music','read','dancing'],
'addr':{
'country':'China',
'city':'weifang'
}
}
user2={
"_id":2,
"name":"wupeiqi",
"age":20,
'hobbies':['music','read','run'],
'addr':{
'country':'China',
'city':'hebei'
}
}
user3={
"_id":3,
"name":"yuanhao",
"age":30,
'hobbies':['music','drink'],
'addr':{
'country':'China',
'city':'heibei'
}
}
user4={
"_id":4,
"name":"jingliyang",
"age":40,
'hobbies':['music','read','dancing','tea'],
'addr':{
'country':'China',
'city':'BJ'
}
}
user5={
"_id":5,
"name":"jinxin",
"age":50,
'hobbies':['music','read',],
'addr':{
'country':'China',
'city':'henan'
}
}
db.user.insertMany([user1,user2,user3,user4,user5])
- 查:
db.user1.find() # 查所有
# 查询id为1的数据
db.user1.find({"_id": "1"}) # 根据条件查询
db.user1.findOne() # 查单个
- 删除:
- 删除一条文档
db.user1.deleteOne({"name": "tank"})
- 删除所有文档
db.user1.deleteMany({})
python连接MongoDB
首先要安装pymongo:pip3 install pymongo
from pymongo import MongoClient
#获取一个客户端连接对象
client = MongoClient('localhost', 27017)
# # use 数据库
# # 等同于:use user_db
db = client['user_db']
# 3、查看库下所有的集合
# print(db.collection_names(include_system_collections=False))
# 4、创建集合 user_info 等同于: db.user_info
user_info_col = db['user_info']
user1 = {
'_id': 6,
'name':'jinx',
'age': 18
}
user2 = {
'_id': 5,
'name':'nx',
'age': 18
}
#都是插入单挑数据,后面的比较老,前面的既可以插入单挑也可以插入多条,而且返回值不一样,后面的是返回一个对象,前面的是返回id。有了id,就可以查询数据了。
user_info_col.insert(user1)
user_info_col.insert_one(user1)
#插入多条数据
# res = user_info_col.insert_many([user1, user2])
#查询一条数据
# res = user_info_col.find_one({'_id':5})
# print(res)
#改一条数据
user_info_col.update({'_id':5}, {'name':'jinxixixixi'})