mongodb基础简介
1.1 简介
它是一个内存数据库,数据都是放在内存里面的。
对数据的操作大部分都在内存中,但MongoDB并不是单纯的内存数据库。
MongoDB 是由 C++ 语言编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB 旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
1.2 格式
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
JSON文件
{}:代表字典
[]:列表
,:分隔两个部分
::键值对
{
"code": 1,
"totle": 3,
"pers": [
{
"name":"tom1",
"age":18
},
{
"name":"tom2",
"age":19
},
{
"name":"tom3",
"age":17
}
]
}
BSON:
1.3 特点
在传统的关系型数据库中,数据是以表为媒介进行存储的,每个表均拥有纵向的列和横向的行。
由此可见,相比较 MySQL,MongoDB 以一种直观文档的方式来完成数据的存储。它很像 JavaScript 中定义的 JSON 格式,不过数据在存储的时候 MongoDB 数据库为文档增加了序列化的操作,最终存进磁盘的其实是一种叫做 BSON 的格式,即 Binary-JSON。
1.4 MongoDB 的应用场景
如果是因为业务需求或者是项目初始阶段,而导致数据的具体格式无法明确定义的话,MongoDB的这一鲜明特性就脱颖而出了。相比传统的关系型数据库,它非常容易被扩展,这也为写代码带来了极大的方便。
不过 MongoDB 对数据之间事务关系支持比较弱,如果业务这一方面要求比较高的话,MongoDB 还是并不适合此类型的应用。
非关系型数据库(NoSQL ),属于文档型数据库。先解释一下文档的数据库,即可以存放 xml、json、bson 类型系那个的数据。这些数据具备自述性(self-describing),呈现分层的树状数据结构。数据结构由键值(key=>value)对组成。
1.5 存储方式:虚拟内存 + 持久化。
1.5.1 持久化方式:
MongoDB 的所有数据实际上是存放在硬盘的,所有要操作的数据通过 mmap 的方式映射到内存某个区域内。
1.5.2 虚拟内存
当物理内存够用的时候,Redis>MongoDB>MySQL
当物理内存不够用的时候,Redis和MongoDB都会使用虚拟内存。
实际上如果Redis要开始虚拟内存,那很明显要么加内存条,要么你就该换个数据库了。
1.6 mongodb的概念及与sql的区别
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 表/集合 |
row | document | 行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表关联/MongoDB不支持 | |
primary key | primary key | 主键索引/mongodb自动将_id设置为主键索引 |
linux 安装(16.04 and 18.04)
略
mongodb配置
2.1 远程连接
远程连接:
/etc/mongod.conf
注释: bindIp: 127.0.0.1 或者 bindIp : 0.0.0.0
:wq
mongo IP:port
2.2 远程连接问题
mongodb数据库启动后,默认只能在本地使用,端口为27017,那么如何设置让它可以远程访问呢?
- 修改配置文件mongodb.conf
命令:vim /etc/mongodb.conf
把 bind_ip=127.0.0.1 这一行注释掉或者是修改成 bind_ip=0.0.0.0,最好是直接注释掉,因为在centos下,使用bind_ip=0.0.0.0会报错。
注意:设置远程访问以后,密码启动auth授权访问,不然非常不安全,数据库容易被攻击,在配置文件中修改如下:
#Turn on/off security. Off is currently the default #noauth = true auth = true
-
在mongo数据库中新建用户名和密码:
在非授权模式下启动数据库,并使用mongo连接上数据库,例如我们要新建meeting数据库的用户和密码,则:
use meeting
db.createUser({user:“kimkat”,pwd:“123456”,roles:[{ role: “readWriteAnyDatabase”, db: “meeting” }]})
注意:如果要添加meeting数据库的用户,请先use meeting,不然即使添加成功,也连接不上。
mongodb添加用户的方法:https://docs.mongodb.com/manual/reference/method/db.createUser/index.html
mongodb内置的用户角色:https://docs.mongodb.com/manual/core/security-built-in-roles/index.html -
重启mongodb服务
命令:/etc/init.d/mongodb restart
2.1防火墙开放27017端口
命令:iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 27017 -j ACCEPT
注意:如果是云服务器,一般不用在系统内打开端口,只要在服务器管理界面打开端口就可以了。 -
远程连接
要连接的IP:116.85.12.51
命令:mongo 116.85.12.51:27017/meeting -u “kimkat” -p “123456”
这样就可以连接到116.85.12.51的mongodb/meeting的数据库了。
建议使用robo3t,mongovue,或者mongo compass等可视化工具来连接,其中官方提供的mongo compass可以直接导出csv文件。
笔者尝试了使用windows下的mongo.exe连接云服务器上的数据库,结果因为shell和server不匹配,所以失败。
mongodb的命令
3.1 数据库操作
- 使用数据库
use 数据库名字 数据库不存在则创建数据库,如果存在则使用 - 列出所有数据库
show dbs 查看所有的数据库 类似: mysql show databases - 删除:
db.dropDatabase() 必须进入要删除数据库
3.2 集合操作:(表)
- 创建集合
db.createCollection(‘集合名字’)
db.createCollection(‘集合名字’,{capped:true,size:xxx,max:xxx,autoIndexId:xxxx})
-
查看
show collections 查看集合 -
删除
db.集合名.drop()
db.student.drop() 删除student集合 -
插入
db.student.insert({
‘sname’:’zhangsan’,
‘age’:20,
‘addr’:’baoshengli’
})
-
插入多个值
db.集合.insertMany([{},{},{}]) -
更新操作:
db.student.update({‘name’:‘zhangfei’},{$set:{‘age’:21,‘friends’:[‘zhaoyun’,‘guanyu’]}}
db.student.save(document)
- 条件删除某个信息:
db.collection.remove(query[where条件])
db.student.remove({‘name’:xxxx})
db.student.remove(‘age’:{$lt:20}) delete from student where age<20
- 运算符
$lt <
$gt >
$lte <=
$gte >=
db.student.remove({'age':{$gt:21,$lt:28}}) delete from student where age>21 and age<28 db.student.find({$or:[{'addr':'wuguo'},{'age':{$gt:21}}]})
- 查询操作:
db.student.find(query 查询条件) --→ select * from student
{
‘age’:20
‘age’:’20’
}
类型:
$type:
double
string
array:[]
boolean
date
null
- 模糊查询:
db.student.find({‘name’:{KaTeX parse error: Expected 'EOF', got '}' at position 12: regex:/^zh/}̲}) --→ 名字是‘zh…regex:/zh/}}) ----》名字中出现’zh’
db.student.find({‘name’:{$regex:/^zh/i}})
limit(number):查询多少个
sort({‘age’:-1}) 降序
sort({‘age’:1}) 升序
分组:
聚合:
db.student.aggregate({KaTeX parse error: Expected '}', got 'EOF' at end of input: …id:null,total:{sum:‘KaTeX parse error: Expected 'EOF', got '}' at position 5: age'}̲}}) { "_id" : n…group:{_id:null,avg:{ a v g : ′ avg:' avg:′age’}}})
{ “_id” : null, “avg” : 22.333333333333332 }
db.student.aggregate({KaTeX parse error: Expected '}', got 'EOF' at end of input: …{_id:null,max:{max:‘KaTeX parse error: Expected 'EOF', got '}' at position 5: age'}̲}}) { "_id" : n…group:{_id:null,min:{ m i n : ′ min:' min:′age’}}})
db.student.aggregate({KaTeX parse error: Expected '}', got 'EOF' at end of input: …id:null,count:{sum:1}}})
python(pycharm)的交互
4.1 创建客户端连接对象
client = MongoClient()
print(client)
4.2 通过此对象访问数据,mydb就是mongodb的名字
db = client.mydb
print(db)
4.3 创建集合
course = db.course 有则访问,没有则创建集合
4.4 添加数据
r =course.insert({‘cname’:‘python’,‘grade’:4})
course_list = [{‘cname’:‘mysql’,‘grade’:3},{‘cname’:‘html’,‘grade’:3},{‘cname’:‘javascript’,‘grade’:4}]
r = course.insert(course_list)
-
更新:
r = course.update({‘cname’:‘javascript’},{’$set’:{‘grade’:4}}) -
删除:
course.remove({‘cname’:‘html’}) -
查询:
r= course.find()
print( r )
for data in r: # 遍历查询数据
print(data)
mysql
redis key-value
mongodb: JSON
from pymongo import MongoClient
# port: 27017
client = MongoClient(host='10.0.102.67')
print(client)
#
db = client.mydb
print(db)
course = db.course
# 插入数据
r =course.insert({'cname':'python','grade':4})
print(r) # 返回_id
# 插入多个值
course_list = [{'cname':'mysql','grade':3},{'cname':'html','grade':3},{'cname':'javascript','grade':4}]
r = course.insert(course_list)
print(r)
# 更新数据,返回修改详情
r = course.update({'cname':'javascript'},{'$set':{'grade':4}})
print(r)
# 删除信息
r= course.remove({'cname':'html'})
print(r)
# 查询所有并排序按照grade,再按照cname,1为升序
r= course.find().sort([('grade',1),('cname',1)])
print(r)
for data in r:
print(data)
# 查询grade在(3,4,1)之中,并按照grade降序
r = course.find({'grade':{'$in':(3,4,1)}}).sort([('grade',-1)])
# 查询名字是python的或者成绩小于等于3的
r = course.find({'$or':[{'cname':'python'},{'grade':{'$lte':3}}]})
for data in r:
print(data)