资讯详情

MongoDB数据库的句子备份

MongoDB是基于分布式的 文件存储的NoSQL适合存储的数据库JSON风格文件的形式。

三要素:数据库、集合和文档。

文档:对应关系数据库中的行,是由键对组成的对象json的扩展Bson形式,示例 {‘name’:‘guojing’,‘gender男} 集合:类似于关系数据库中的表,存储多个文档,结构不固定,示例 {‘name’:‘guojing’,‘gender男} {‘name’:‘huangrong’,‘age’:18} {‘book’:‘shuihuzhuan’,‘heros’:‘108’} 一、环境安装与运行

安装

sudo apt-get install mongodb 配置文件为 /etc/mongodb.conf,默认端口号:27017

启动服务器

sudo service mongodb start #相当于执行命令 sudo mongod --config /etc/mongod.conf 关闭服务器

sudo service mongodb stop 重启服务器

sudo service mongodb restart ##修改配置文件/etc/mongodb.conf后,需要重启mongodb服务器使配置生效 启动客户端

sudo mongo 二、数据库操作

查看当前数据库

db 查看所有数据库

show dbs 数据库切换(或创建)

use 数据库名 如果数据库不存在,当插入数据或创建集合时,数据库将自动创建

删除数据库

db.dropDatabase() 删除当前指向的数据库,如果不存在,什么也不做

三、集合操作

创建

db.createCollection(name[,options]) #name集合名称 #options可选,是指定集合配置的文档,其中capped默认情况下,上限(false),若设置上限(true)需要指定参数size,单位字节 #不设置集合大小 db.createCollection(“stu”) #设置集合尺寸 db.createCollection(“sub”, { capped : true, size : 10 } ) 查看当前数据库集合

show collections 删除集合

db.集合名.drop() 四、数据操作

插入

db.集合名.insert(文档) 或 db.集合名.insert([文档…]) #如不指定_id分配一个唯一的字段ObjectId;如果指定_id字段,且_id当它已经存在时,不要做任何操作;如果一次插入多个数据,以数组的形式输入文档 复制代码

不指定_id

db.stu.insert({name:‘gj’,gender:1})

#指定_id s1={_id:‘20160101’,name:‘hr’} s1.gender=0 db.stu.insert(s1) 复制代码 删除–(注意justOne参数)

db.集合名.remove(条件,{justone:}) #参数justOne默认false,删除多条

只删除匹配的数据

db.stu.remove({gender:0},{justOne:true})

#删除所有 db.stu.remove({}) 修改–(注意$set以及multi参数)

db.集合名.update({条件},KaTeX parse error: Expected 'EOF', got '#' at position 26: …: <boolean>}]) #?参数multi只和操作符一起使用,默认false,只修改一个数据,true表示修改多个数据 复制代码

不要使用操作符$set,修改整个文档

db.stu.update({name:‘hr’},{name:‘mnc’})

#使用操作符KaTeX parse error: Expected '}', got 'EOF' at end of input: …e({name:'hr'},{ set:{name:‘hys’}})

#multi参数和KaTeX parse error: Expected '}', got 'EOF' at end of input: …stu.update({},{ set:{gender:0}},{multi:true}) 复制代码 保存

db.集合名.save(document) #手动插入_id如果_id已经存在,做全文档更新操作,其余都表示插入数据。 db.stu.save({_id:‘20160102’,‘name’:‘yk’,gender:1}) db.stu.save({_id:‘20160102’,‘name’:‘wyk’}) #修改上述文档 查询

基本查询

db.集合名.find({条件文件}) #查询所有 db.集合名.findOne({条件文档}) #只查询第一条 db.集合名.find({条件文件}).pretty() #结果格式化输出 比较运算符

等于:默认,没有运算符 小于: $lt 小于等于: l t e 大 于 : lte 大于: lte大于:gt 大于等于: g t e 不 等 于 : gte 不等于: gte不等于:ne #查询年龄大于等于18岁的学生 db.stu.find({“age”:{$gte:18}}) 逻辑运算符

逻辑与:默认 逻辑或:$or 复制代码

查询年龄大于或等于18、性别为1的学生

db.stu.find({“age”:{$gte:18},“gender”:1})

#查询年龄在18岁以上或性别为0的学生 db.stu.find({ KaTeX parse error: Expected '}', got 'EOF' at end of input: or:[{"age":{ gt:18}},{“gender一}

#查询年龄小于18或20,性别为1的学生 db.stu.find({ KaTeX parse error: Expected '}', got 'EOF' at end of input: or:[{"age":{ lt:18}},{“age”:{$gt:20}}],“gender”:1}) 复制代码 范围运算符

<>在某个范围 i n , 后 面 接 数 组 不 在 某 个 范 围 in,后面接数组 不在某个范围 in,后面接数组不在某个范围nin,后面接数组 #查询年龄18、20以及22岁的学生 db.stu.find({“age”:{$in:[18,20,22]}})

#查询年龄不等于18或20的学生 db.stu.find({“age”:{$nin:[18,20]}}) 正则表达式

使用/表达式/或者KaTeX parse error: Expected 'EOF', got '#' at position 7: regex #̲查询姓黄的学生 db.stu.…regex:"^黄"}}) 自定义查询

使用KaTeX parse error: Expected 'EOF', got '&' at position 58: …算符使用js语法,比如逻辑与(&̲&),逻辑或(||) #查询年…where:function(){return this.age>18 && this.age<22}})

#查询年龄小于18或者大于22的学生 db.stu.find({$where:function(){return this.age<18 || this.age>22}}) 投影

只显示部分字段 db.集合名.find({条件},{字段名:1,…}) #1表示该字段显示,0不显示;_id列默认显示,不显示需要明确设置为0 #查询姓名和年龄(显示_id) db.stu.find({},{name:1,gender:1})

#查询姓名和年龄(不显示_id) db.stu.find({},{_id:0,name:1,gender:1}) skip

跳过指定数量的文档 db.集合名.find({条件}).skip(number) #number默认为0 #查询从第3条开始的学生信息 db.stu.find().skip(2) limit

读取指定数量的文档 db.集合名.find({条件}).limit(number) #不写number参数,默认读取所有文档 #读取3条学生信息 db.stu.find().limit(3) skip和limit合用

不区分先后顺序 #查询第5-9条学生信息 db.stu.find().skip(4).limit(5) #相当于跳过4条数据,选5条 sort

对结果集进行排序 db.集合名称.find({条件}).sort({字段:1,…}) #1表示升序,-1表示降序 #根据性别降序,再根据年龄升序 db.stu.find().sort({“gender”:-1,“age”:1}) count

对结果集中文档数目进行统计,返回整数 db.集合名.find({条件}).count() 或者 db.集合名.count({条件}) #统计年龄大于20的男生人数 db.stu.count({“age”:{$gt:20},“gender”:1}) distinct

对数据去重,返回的是一个列表 db.集合名.distinct(“字段名”,{条件}) 五、聚合(aggregate)

聚合主要用于计算数据,类似sql中的sum()、avg()

db.集合名.aggregate([{管道:{表达式}}…]) 管道

文档处理完毕后,通过管道进行下一次处理

常用管道:

$group:将集合中的文档分组,可用于统计结果 $match:过滤数据,只输出符合条件的文档 $project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果 $sort:将输入文档排序后输出 $limit:限制聚合管道返回的文档数 $skip:跳过指定数量的文档,并返回余下的文档 $unwind:将数组类型的字段进行拆分 表达式

处理输入文档并输出

语法:表达式:‘$字段名’

常用表达式:

s u m : 计 算 总 和 , sum:计算总和, sum:计算总和,sum:' 字 段 ′ 表 示 求 和 , 注 意 字段'表示求和,注意 字段′表示求和,注意sum:1表示计数, $avg:计算平均值 $min:获取最小值 $max:获取最大值 $push:在结果文档中插入值到一个数组中(以列表的方式显示字段值) $first:根据资源文档的排序获取第一个文档数据 $last:根据资源文档的排序获取最后一个文档数据 $group

文档分组,用于统计结果 _id表示分组的依据,使用某个字段的格式为’$字段’

统计男、女生人数

db.stu.aggregate([{ KaTeX parse error: Expected '}', got 'EOF' at end of input: …der',"couter":{ sum:1}}}]) #结果文档中显示_id和counter的值 _id按照null分组,会将集合中所有文档分为一组

求学生总人数和平均年龄

db.stu.aggregate([{ KaTeX parse error: Expected '}', got 'EOF' at end of input: …:null,counter:{ sum:1},average_age:{ a v g : " avg:" avg:"age"}}}]) 使用KaTeX parse error: Expected 'EOF', got '#' at position 23: …文档内容加入到结果集的数组中 #̲统计男、女生信息 db.stu…ROOT"}}}]) $match

过滤数据,输出符合条件文档 #查询年龄大于20的学生 db.stu.aggregate([{ KaTeX parse error: Expected '}', got 'EOF' at end of input: match:{age:{ gt:20}}}])

#查询年龄大于20的男、女生人数 db.stu.aggregate([{ KaTeX parse error: Expected '}', got 'EOF' at end of input: match:{age:{ gt:20}}},{ KaTeX parse error: Expected '}', got 'EOF' at end of input: group:{_id:"gender",counter:{$sum:1}}}]) $project

修改输出文档的结构 #查找学生姓名、年龄 db.stu.aggregate([{$project:{"_id":0,“name”:1,“age”:1}}])

#查询男生、女生人数,但仅输出人数 db.stu.aggregate([{ KaTeX parse error: Expected '}', got 'EOF' at end of input: group:{_id:'gender’,counter:{ KaTeX parse error: Expected 'EOF', got '}' at position 6: sum:1}̲}},{ project:{_id:0,counter:1}}]) $sort

将输入文档排序后输出 #查询学生信息,按年龄升序 db.stu.aggregate([{$sort:{age:1}}])

#查询男生、女生人数,按人数降序 db.stu.aggregate([{ KaTeX parse error: Expected '}', got 'EOF' at end of input: group:{_id:'gender’,counter:{ KaTeX parse error: Expected 'EOF', got '}' at position 6: sum:1}̲},{ sort:{counter:-1}}]) $limit

限制聚合管道返回的文档数 #查询2条学生信息 db.stu.aggregate([{$limit:2}]) $skip

跳过指定数量的文档,并返回余下的文档, s k i p 和 skip和 skip和limi合用时,注意先写skip,再写limit 复制代码 #查询从第3条开始的学生信息 db.stu.aggregate([{$skip:2}])

#统计男生、女生人数,按人数升序,取第二条数据 db.stu.aggregate([{ KaTeX parse error: Expected '}', got 'EOF' at end of input: group:{_id:"gender",counter:{ KaTeX parse error: Expected 'EOF', got '}' at position 6: sum:1}̲}},{ sort:{“counter”:1}},{ KaTeX parse error: Expected 'EOF', got '}' at position 7: skip:1}̲,{ limit:1}]) 复制代码 $unwind

将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值 db.集合名称.aggregate([{ u n w i n d : ′ unwind:' unwind:′字段名称’}]) 六、索引

提升查询速度

创建大量数据

for(var i=0;i<1000000;i++){db.stu.insert({name:‘test’+i,num:i})} 性能分析工具:explain(“executionStats”)

查询语句.explain(“executionStats”) 'millis’后面显示的是查询时间,单位ms

建立索引

db.集合.ensureIndex({属性:1或-1}) #1表示升序,-1表示降序,建立后的索引名称为"属性_1"或者"属性_-1" 例如:db.stu.ensureIndex({name:1}),建立后的索引名称为"name_1"

建立唯一索引

db.集合.ensureIndex({属性:1},{“unique”:true}) 建立联合索引

db.集合名.ensureIndex({属性1:1,属性2:1…}) 查看索引

db.集合名.getIndexes() 删除索引

db.集合名.dropIndex(“索引名称”) 七、数据库安全

为了更安全的访问mongodb,需要访问者提供用户名和密码,于是需要在mongodb中创建用户。mongodb数据库采用了角色-用户-数据库的安全管理方式。

常用系统角色如下:

root:只在admin数据库中可用,超级账号,超级权限 Read:允许用户读取指定数据库 readWrite:允许用户读写指定数据库 创建超级管理用户:

复制代码 use admin #首先切换到admin数据库

db.createUser({ user:‘用户名’, pwd:‘密码’, roles:[{role:‘root’,db:‘admin’}] }) 复制代码 启用安全验证

修改配置文件( /etc/mongodb.conf)

#noauth = true auth = true #开启安全验证 重启服务

sudo service mongodb restart 终端连接 http://www.taom8.com http://www.hmgczx.com http://www.bizhizhigan.com http://www.quanshengbio.com http://www.0596pzh.com http://www.hlzxcy8899.cn http://www.mingyan365.cn http://www.20862.cn http://www.zqshihua.cn http://www.xuechengyikao.cn http://www.quanqiudianying.com http://www.meinanzhi.cn http://www.qizhenwei.cn http://www.1pinju.cn http://www.bxaad.com http://www.qiaolr.com http://www.120huadong.com http://www.xuqinw.com http://www.jgw765.com http://www.meaqimongl.com http://www.yyjinmeng.cn http://www.kor-doctor.cn http://www.cxsex.cn http://www.sgjmw.cn http://www.qcyhb.cn http://www.jh-xc.com http://www.anyuebei.com http://www.wannengyijia.com http://www.xinlongdakqf.com http://www.aotaijidian.com http://www.wanputi.com http://www.tiancankj.cn http://www.wcfxsh.cn http://www.gzsrjx.cn http://www.qiniupump.cn http://www.njwxeq.cn http://www.1yuanzg.cn http://www.dongzhichun.cn http://www.dongdazhai.cn http://www.dezhenbang.cn http://www.hsguosen.cn http://www.jmjtc.cn http://www.lianweikaisuo.cn http://www.fscaitian.cn http://www.whsdbg.cn http://www.bblys.cn http://www.icemonkey.com.cn http://www.szvolkin.cn http://www.haoma999.com http://www.lieshangjob.com http://www.jiniuai.com http://www.eqdiy.com http://www.junshitianxia.com http://www.baliimpression.com http://www.bdtylq.com http://www.mcvvv.com http://www.dingchenwy.com http://www.365wende.com http://www.boquanjiaju.cn http://www.flashcredit.cn http://www.huizujiapu.cn http://www.filmvideo.com.cn http://www.www868.cn http://www.fqathb.com http://www.wxxhr.com http://www.zuoshoujiwangzhan.com http://www.ychydraulic.com http://www.qxyuxin.com http://www.e-jke.com http://www.szspnet.com http://www.mingyin246.com http://www.teagk.com http://www.zzjishiyu.com http://www.dfbanjia.cn http://www.nmt180.cn http://www.njtcbj.cn http://www.ysxpj.cn http://www.xryoga.cn http://www.99-ts.com http://www.mokeculture.com http://www.wenyaqkw.com http://www.modalsukses.com http://www.neli-studios.com http://www.delight-esthe.com http://www.soumokuan.com http://www.superbike38.com http://www.drtahqiqco.com http://www.vimaxshop.com http://www.baozouweilai.com http://www.vechainicowei.com http://www.longsheng588.com http://www.bookbbs.cn http://www.jnjhcm.com http://www.xqgangting.com http://www.vunsher.com http://www.hefeiqianghui.com http://www.jyxk120.com http://www.yunnanpeixun.top http://www.aimeire.cn http://www.leadpacking.cn http://www.gaokao123.org.cn http://www.icct.org.cn http://www.selfnet.cn http://www.87716425.com http://www.cxhzyl.org.cn http://www.fnxzfw.cn http://www.fzjszjz.cn http://www.jrcn.com.cn http://www.ruizhiyuantech.cn http://www.itbooks.cn http://www.liuyanoffice.com http://www.yihaiis.com.cn http://www.sxhanhui.com http://www.youba8.com http://www.zzhyqd.com http://www.yantaizy.cn http://www.qingquxiaoyou.com http://www.yesexy.com http://www.lanqiuhuo.com http://www.fenke.cc http://www.114yiyao.com http://www.srbpf.com http://www.5cdmi.com http://www.91jhx.com http://www.eagle318.com http://www.lhglt.com http://www.xingyuesports.cn http://www.zhiliaobaidianfeng.cn http://www.light361.com http://www.xiyulieren.top http://www.startupdog.cn http://www.manyouyou.com.cn http://www.okbiz.com.cn http://www.mmphoto.cn http://www.quanbba.com http://www.xmbns.com http://www.hpyweb.com http://www.qingdaotangshi.cn http://www.dllongxiang.cn http://www.zibolan.com.cn http://www.lyrsjkx.cn http://www.rqzhly.cn http://www.hsapjx.cn http://www.bxgscc.cn http://www.yinyuewenxue.cn http://www.211idc.cn http://www.tejiavip.cn http://www.yearita.cn http://www.91buycar.cn http://www.021pc120.cn http://www.sxbyz.cn http://www.mobilegoogle.cn http://www.czshjz.cn http://www.zhichengsb.cn

sudo mongo -u ‘用户名’ -p ‘密码’ --authenticationDatabase ‘数据库名’

sudo mongo -u ‘admin’ -p ‘密码’ --authenticationDatabase ‘admin’ 普通用户管理

首先使用超级管理员登陆,然后再进行用户管理操作

创建普通用户

db.createUser({ user:‘用户名’, pwd:‘密码’, roles:[{role:‘readWrite’,db:‘数据库名’}…] #数组里可以有多个角色文档,比如用户在不同的数据库里都有读写权限 }) 查看当前数据库的用户

show users 修改用户:可以修改pwd、roles属性

db.updateUser(‘用户名’,{pwd:‘新密码’,roles:[{‘新角色’}…]}) 删除用户

use admin #切换到admin数据库 db.system.users.remove(条件) 终端连接

sudo mongo -u ‘用户名’ -p ‘密码’ --authenticationDatabase ‘数据库名’ 八、复制

复制提供了数据的冗余备份,并在多个服务器上存储数据的副本,允许从硬件故障和服务中断中恢复数据,能够实现无宕机维护(自动故障转移与自动恢复)。

复制至少需要2个节点,其中1个为主节点,其它均为从节点。任何节点均可以成为主节点。

主节点负责所有写入操作,从节点定期轮询主节点获取这些操作并执行这些操作,从而保证从节点的数据与主节点一致。

设置复制节点

创建数据库文件存放目录(自定义)

mkdir ~/Desktop/t1 mkdir ~/Desktop/t2 使用如下格式启动mongod,如果在同一台主机上,注意port不能相同,replSet的名称必须是一致的(名称可以自定义)

sudo mongod --bind_ip 192.168.196.128 --port 27017 --dbpath ~/Desktop/t1 --replSet rs0 sudo mongod --bind_ip 192.168.196.128 --port 27018 --dbpath ~/Desktop/t2 --replSet rs0 连接主服务器(自定义一个)

sudo mongo --host 192.168.196.128 --port 27017 初始化

rs.initiate() 哪个服务器执行初始化,哪个服务器就作为主节点,rs是mongo服务器中专门用于复本集操作的内置对象

查看当前状态

rs.status() 添加副本集

rs.add(“192.168.127.128:8899”) 连接从服务器

sudo mongo --host 192.168.196.128 --port 27018 从服务器设置

rs.slaveOk() 主服务器插入数据,从服务器就可以读取数据了

删除从节点

rs.remove(‘192.168.196.128:27018’) #需要在主服务器操作 关闭主服务器后再重新启动,会发现原来的从服务器变为了主服务器,新启动的服务器(原来的主服务器)变为了从服务器,但是注意重新设置rs.slaveOk()

九、备份与恢复

备份

语法

sudo mongodump -h 服务器地址 -d 需要备份的数据库 -o 备份数据存放目录 mkdir ~/Desktop/test1_bak #创建存放备份数据的目录 sudo mongodump -h 192.168.196.128:27017 -d test1 -o ~/Desktop/test1_bak 恢复

语法

sudo mongorestore -h 服务器地址 -d 恢复后数据库名 --dir 备份数据所在位置 sudo mongorestore -h 192.168.196.128:27017 -d test2 --dir ~/Desktop/test1_bak/test1 十、python交互

安装pymongo包

sudo pip3 install pymongo 引入包

import pymongo 建立连接并创建客户端

有安全认证:client=MongoClient(“mongodb://用户名:密码@host:27017/数据库名称”) 无安全认证:client=MongoClient(“mongodb://localhost: 27017”) 获得数据库(以test数据库为例)

db = client.数据库名 例如:db = client.test 获得集合stu

stu = db.stu 数据操作

查询

find_one 查找单个文档 stu1 = stu.find_one({条件}) #返回一条文档,字典类型 find 查找多个文档 复制代码 cursor = stu.find({条件}) #返回迭代器对象cursor #方式1:用for循环迭代取值 for s in cursor: print(s) #字典类型

#方式2:用next取值 s1 = next(cursor) s2 = next(cursor) … 复制代码 插入

insert_one 插入一条文档 stu.insert_one(文档) insert_many 插入多条文档 stu.insert_many([文档1,文档2…]) 更新

update 更新匹配到的第一条整条文档 stu.update({条件},文档) #注意条件中的数字一定要写成字符串类型 update_one 与KaTeX parse error: Expected '}', got 'EOF' at end of input: …date_one({条件},{ set:{文档}}) update_many 与KaTeX parse error: Expected '}', got 'EOF' at end of input: …ate_many({条件},{ set:{文档}}) 删除

delete_one 删除单条文档 stu.delete_one({条件}) delete_many 删除多条文档 stu.delete_many({条件})

标签: pc120光控开关继电器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

 锐单商城 - 一站式电子元器件采购平台  

 深圳锐单电子有限公司