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:
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术语/概念解释/说明
databasedatabase数据库
tablecollection表/集合
rowdocument行/文档
columnfield数据字段/域
indexindex索引
table joins表关联/MongoDB不支持
primary keyprimary 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,那么如何设置让它可以远程访问呢?

  1. 修改配置文件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
  1. 在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

  2. 重启mongodb服务
    命令:/etc/init.d/mongodb restart
    2.1防火墙开放27017端口
    命令:iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 27017 -j ACCEPT
    注意:如果是云服务器,一般不用在系统内打开端口,只要在服务器管理界面打开端口就可以了。

  3. 远程连接
    要连接的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 数据库操作

  1. 使用数据库
    use 数据库名字 数据库不存在则创建数据库,如果存在则使用
  2. 列出所有数据库
    show dbs 查看所有的数据库 类似: mysql show databases
  3. 删除:
    db.dropDatabase() 必须进入要删除数据库

3.2 集合操作:(表)

  1. 创建集合

db.createCollection(‘集合名字’)

db.createCollection(‘集合名字’,{capped:true,size:xxx,max:xxx,autoIndexId:xxxx})

  1. 查看
    show collections 查看集合

  2. 删除
    db.集合名.drop()
    db.student.drop() 删除student集合

  3. 插入
    db.student.insert({
    ‘sname’:’zhangsan’,
    ‘age’:20,
    ‘addr’:’baoshengli’

})

  1. 插入多个值
    db.集合.insertMany([{},{},{}])

  2. 更新操作:

db.student.update({‘name’:‘zhangfei’},{$set:{‘age’:21,‘friends’:[‘zhaoyun’,‘guanyu’]}}

db.student.save(document)

  1. 条件删除某个信息:

db.collection.remove(query[where条件])

db.student.remove({‘name’:xxxx})
db.student.remove(‘age’:{$lt:20}) delete from student where age<20

  1. 运算符
    $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}}]})
  1. 查询操作:

db.student.find(query 查询条件) --→ select * from student

{
‘age’:20
‘age’:’20’
}
类型:
$type:
double
string
array:[]
boolean
date
null

  1. 模糊查询:

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:&#x27; 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:&#x27; 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)

  1. 更新:
    r = course.update({‘cname’:‘javascript’},{’$set’:{‘grade’:4}})

  2. 删除:
    course.remove({‘cname’:‘html’})

  3. 查询:

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)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只敲代码的大脸猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值