技术栈 | MongoDB的最合理用法
启迪云计算概要
为什么要用Mongodb数据库呢?
怎么安装以及使用Mongodb?
NoSQL的简介:
NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL"。
在现代的计算系统上每天网络上都会产生庞大的数据量。
这些数据有很大一部分是由关系数据库管理系统(RDBMS)来处理。1970年E.F.Codd's提出的关系模型的论文"A relational model of data for large shared data banks",这使得数据建模和应用程序编程更加简单。
通过应用实践证明,关系模型是非常适合于客户服务器编程,远远超出预期的利益,今天它是结构化数据存储在网络和商务应用的主导技术。
NoSQL 是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。
对于一名程序员来说,使用NoSQL应成为一条必备技能。
关系型和非关系型的介绍:
对于关系型数据库,存储数据的时候需要提前建表建库,随着数据的复杂度越来越高,所建的表的数量也越来越多,但是非关系型却不需要。
什么是MongoDB?
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于JSON 对象。字段值可以包含其他文档,数组及文档数组。
MongoDB的特点:
MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。
你可以在MongoDB记录中设置任何属性的索引(如:FirstName="Sameer",Address="8 Gandhi Road")来实现更快的排序。
你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。
Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
MongoDB安装简单
MongoDB的优势:
易扩展:NoSQL数据库种类繁多,但是都有一个共同的特点都是去掉去掉关系数据型特性。数据之间无关系,这样就非常容易扩展。
大数据量,高性能:NoSQL数据库都有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系型,数据库的结构简单。
灵活的数据模型:NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦。
MongoDB的安装:
6.1命令的安装
sudo apt-get install -y mongodb
6.2源码安装
6.3 服务器mongodb的启动
启动方式1:
启动:sudo service mongod start(sudo service mongodb start,mongod 改为mongodb。下同)
停止:sudo service mongodb stop
重启:sudo service mongodb restart
配置文件的位置:/etc/mongod.conf
日志的位置:/var/log/mongodb/mongod.log
默认端口:27017
启动方式2:
启动:sudo mongod [--dbbath=dbpath –logpath=logpath –-append -fork] [ -f logfile]
只以sudo mongod命令启动时,默认将数据存放在了/data/db目录下,需要手动创建
--dnpath:指定数据的存放路径
--logpath:指定日志的存放路径
--logappend:设置日志的写入形式为追加模式
-fork:开启新的进程运行mongodb服务
f:配置文件(可以将上述配置信息 写入文件然后通过本参数进行加载启动)
6.4 客户端mongodb
启动本地客户端:mongo
查看帮助:mongo-help
退出:exit或者ctrl+c
为什么要进行权限管理的设置?
刚安装完毕的mongodb默认不使用权限认证方式启动,与MySQL不同,mongodb在安装的时候并没有设置权限,然而公网运行系统需要设置权限以保证数据安全。
Mongodb超级管理员账号的创建
8.1以权限认证的方式启动mongodb数据库
sudo mongod --auth
8.2启动之后在启动信息会有如下信息,说明mongodb以权限认证的方式启动成功
[initandlisten] options: { security: { authorization: "enabled" } }
8.3创建超级用户 使用admin数据库(超级管理员账号必须创建在改数据库上)
use admin
创建超级用户
db.createUser({"user":"python","pwd":"python","roles":["root"]})
创建成功后会显示如下信息
uccessfully added user:{"user":"python","roles":["root"]}
8.4退出客户端再次登录验证 此时再使用数据库各命令的时候,会报权限错误,需要认证才能执行相应操作
user admin
db.auth(‘python’,’python’)
1
Python 用户创建在admin数据库上的所以必须来到admin数据库上进行认证,认证成功会返回1,失败返回0
创建普通用户
9.1选择需要创建用户的数据库
use test1
9.2 在使用的数据库上创建普通用户
db.createUser("user":"user1", "pwd":"pwd1", roles:["read"])
创建普通用户user1,该用户在test1上的权限是只读
db.createUser("user":"user1", "pwd":"pwd1", roles:["readWrite"])
创建普通用户user1,该用户在test1上的权限是读写
9.3 在其他数据库上创建普通用户
Useradmin
db.createUser({“user”:”python1”,”pwwd”:”python1”,roles:[{“role”:”read”,”db”:dbname1},{“role”:”
readWrite”,”db:”dbname2”}]})
在admin上创建python1用户,python1用户的权限有两个,一个在dbname1上只读,另一个是在dbname2上的读写
查看创建的用户
show users
{
“id”:”admin.python”,
“user”:”python”,
“db”:”admin”,
“roles”:[
{
“role”:”root”,
“db”:”admin”
}]
}
删除用户
db.dropUser(‘python’)
Mongodb中常见的数据类型
11.1 常见类型
Object ID:文档ID
String:字符串,最常用,必须是有效的UTF-8
Boolean:存储一个布尔值,true或false
Integer:整数可以是32位活着64位,这取决于服务器
Double:存储浮点值
Arrays:数组或列表,多个值存储到一个键
Object:用于嵌入式的文档,即一个值为一个文档
Null:存储Null值
Timestamp:时间戳,表示从1970-1-1到现在的总秒数
Date:存储当前日期或时间的UNIX时间格式
11.2注意点
每个文档都有一个属性,为_id,保证每个文档的唯一性,mongodb默认使用_id为主键。
可以自己去设置_id插入文档,如果没有提供,那么mongodb为每个文档提供了一个独特的_id,类型为objectID
objectID是个12字节的六进制数,每个字节两位,一共是24 位的字符串: 前4个字节为当前时间戳 接下来3个字节的机器ID 接下来的2个字节中MongoDB的服务进程id 最后3个字节是简单的增量值。
Mongodb中常见的增删改查
12.1 mongodb的插入
db.Collectionname.insert(document)
db.stu.insert({name:”ll”,gender:1})
db.stu.insert({_id:”1111”,name:”ll”,gender:1})
插入文档时,如果不指定_id参数,Mongodb会为文档分配一个唯一的Oobjectid
12.1 mongodb的保存
命令:db.Collectionname.save(document) 如果?档的_id已经存在则修改, 如果?档的 _id不存在则添加
12.2 mongodb的简单查询
命令:db.Collectionname.find()
12.3 mongodb的更新
db.Collectionname.update(
参数query:查询条件
参数update:更新操作符
参数multi:可选,默认时false,表示只更新找到的第一条记录,值为true表示把满足条件的文档全部更新
db.stu.update({name:'hr'},{name:'mnc'}) 全文档进行覆盖更新
db.stu.update({name:'hr'},{$set:{name:'hys'}}) 指定键值更新操作
db.stu.update({},{$set:{gender:0}},{multi:true}) 更新全部
12.4mongodb的删除
db. Collectionname.remove(
参数query:可选,删除的文档的条件
参数query:可选,如果设为true或1,则只删除一条,默认false,表示删除多条
Mongodb和python交互
Pymongo提供了mongdb和python交互的所有方法,安装方式:
Pip install pymongo
13.1 使用mongodb,导入pymongo并选择要操作的集合
数据库和集合会自动创建
from pymongo import MongoClient
client = MongoClient(host,port)
collection = client[db名][集合名]
13.2添加数据
Insert可以批量的插入数据列表,也可以插入一条数据
collection.insert([{"name":"test10010","age":33},{"name":"test10011","age":34}]/{"na me":"test10010","age":33})
13.3添加一条数据
ret = collection.insert_one({"name":"test10010","age":33})
print(ret)
13.4添加多条数据
item_list = [{"name":"test1000{}".format(i)} for i in range(10)]
#insert_many接收一个列表,列表中为所有需要插入的字典
t = collection.insert_many(item_list)
13.4查找一条数据
#find_one查找并且返回一个结果,接收一个字典形式的条件
t = collection.find_one({"name":"test10005"})
print(t)
13.5 查找全部数据
结果是一个Cursor游标对象,是一个可迭代对象,可以类似读文件的指针,但是只能够进行一次读取
#find返回所有满足条件的结果,如果条件为空,则返回数据库的所有t = collection.find({"name":"test10005"})#结果是一个Cursor游标对象,是一个可迭代对象,可以类似读文件的指针
for i in t: print(i)for i in t: #此时t中没有内容 print(i)
13.6更新一条数据
#update_one更新一条数据collection.update({"name":"test10005"},{"name":"new_test10005"},multi=True/False)
13.7更新一条数据(注意使用$set命令)
#update_one更新一条数据collection.update_one({"name":"test10005"},{"$set":{"name":"new_test10005"}})
13.8更新全部数据
# update_one更新全部数据collection.update_many({"name":"test10005"},{"$set":{"name":"new_test10005"}})
13.9插入更新数据
#update_one更新一条数据collection.update({"name":"test10005"},{"$set":{"name":"new_test10005"}},upsert=True)13.10删除一条数据#delete_one删除一条数据collection.delete_one({"name":"test10010"})13.11 删除全部数据#delete_may删除所有满足条件的数据collection.delete_many({"name":"test10010"})
13.10删除一条数据
#delete_one删除一条数据
collection.delete_one({"name":"test10010"})
13.11 删除全部数据
#delete_may删除所有满足条件的数据
collection.delete_many({"name":"test10010"})
总结:以上就是Mongodb的简单使用,在大数据时代,对数据的保存也越来越重视,非关系型数据库大大减少了我们工作的负担。