首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

https://docs.mongodb.com/manual/tutorial/install-mongodb-on- ubuntu/

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)

插入文档时,如果不指定_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表示把满足条件的文档全部更新

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

互动区

* 你对以上内容有什么看法?你最关注云计算哪个趋势?如果你还有想了解的技术话题,欢迎留言分享。

*「启迪云技术栈」每周4⃣️由启迪云研发部提供技术干货,敬请期待。如需转载请联系小编。

-热门阅读-

启迪云计算有限公司 | 依托于清华启迪控股集团雄厚的资本和强大的科技创新及产业服务能力| 国际领先的私有云及行业云解决方案提供商 | 企业数字化转型首选平台

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181130G0074U00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券