技术栈 | MongoDB的最合理用法

资讯 5年前
1.3K
技术栈 | 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的简单使用,在大数据时代,对数据的保存也越来越重视,非关系型数据库大大减少了我们工作的负担。

© 版权声明

相关文章