MongoDB 数据库 【总结笔记】

一、MongoDB 概念解析

  • 什么是MongoDB? ​ 1、MongoDB是有C++语言编写的,是一个基于分布式文件存储的开源数据库系统,在高负载的情况下,添加更多节点,可以保证服务器的性能 ​ 2、MongoDB为web应用提供了高性能的数据存储解决方案 ​ 3、MongoDB将数据存储为一个文档,数据结构由(key->value)形式组层,MongoDB文档类似于json文件,字段值可以是其他文档,列表等

  • JSON文件

    存储数据的一种格式

  {}:代表字典[]:列表,:分隔两个部分::键值对{"code": 1,"totle": 3,"pers": [{"name":"tom1","age":18},{"name":"tom2","age":19            },{"name":"tom3","age":17            }]}
  • 特点

    1、MongoDB提供了一个面向文档存储,基本思路是将原来的“行”的概念换成了更加领过的“文档”模型,一条记录可以表示非常复杂的层次关系 2、MongoDB支持丰富的查询表达式,查询指令是json形式的标记,可以轻易查询文档中嵌套的对象和列表 3、非常容易扩展,扩展集群后还可以实现集群中的数据的负载均衡。 4、MongoDB支持各种编程语言,比如python、Java、c++、c、php、c#、ruby、JavaScript等 5、丰富的功能,包括索引、存储JavaScript、聚合、固定集合、文件存储等功能 6、方便管理,处理启动数据库服务以外,记过没有其他什么必要的操作。管理集群只需要知道有哪个新增的节点即可,自动继承和配置新节点

SQL术语/概念MongoDB术语/概念解释/说明
databasedatabase数据库
tablecollection表/集合
rowdocument行/文档
columnfield数据字段/域
indexindex索引
table joins 表关联/MongoDB不支持
primary keyprimary key主键索引/mongodb自动将_id设置为主键索引

二、 MongoDB创建数据库

(1) 安装mongoDB

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6
​
#下面命令针对ubuntu16.04版本,在其他ubuntu版本系统请查看MongoDB官网
echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list
sudo apt update
sudo apt install -y mongodb-org
​
查看服务是否启动
pgrep mongo -l
​
#查看版本
mongo -version
​
手动启动
mongod
或者
sudo service mongod start | stop | restart

(2) 进入 MongoDB数据库

> mongo

 

三、 对于库的操作 database

一个MongoDB服务器中可以建立多个数据库,系统保留数据库包括:

  • admin 从权限的角度考虑,这是“root”数据库,要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限,一些特定的数据库服务端的命令只有能从这个数据库运行,比如列出所有的数据库或者关闭服务

  • local 这个数据库永远不会被复制,用来存储仅限于本地单台服务器的一些集合

  • config 当MongoDB用于分片设置时,config数据库在内部使用,用于保存分片的相关数据

数据库命名规范:

  • 不能是空字符串("")

  • 不得含有' '(空格)、.、$、/、\和\0 (空字符)

  • 应全部小写

(1) 创建库

use 库名

注意:

  1. 当use一个不存在的库的时候 其实这个库已经创建出来了 但是里面没有数据 使用show dbs的时候 ,该库不会显示

  2. mongodb严格区分大小写

  3. 数据库名字不要用admin、local和config

在MongoDB里 不管是什么操作 都是db。

语法:db.getName()  获取当前的所在的库
语法:db      获取当前所属的库

(2) 删除数据库

  • 删除数据库之前最好use一下 确定自己所在哪个库下

    语法:db.dropDatabase()

(3) 查看所有的库

语法:show dbs

四、 对于集合的操作 collection

集合相当于关系型数据库中的表,但集合中的数据不必是同一种类型,可以是不同种类型。

  • 集合的名称不能以system.开头

  • 名称不能是保留字

  • 名称不能是空字符

(1) 创建集合(也就是创建表)

语法:db.createCollection('集合名称')
示例:db.createCollection('user')  #在当前的库里面创建一个空user集合
​
语法:db.集合名称.insert(文档)
示例:db.student.insert({name:'tom',age:20}) #创建一个student集合并插入了一个文档

(2) 删除集合

语法:db.集合名.drop()
示例:db.user.drop()  #删除user集合

(3) 显示所有集合

语法:show collections

五、 文档操作

文档是MongoDB中最核心的概念,是其核心单元,将文档类比成关系型数据库中的每一行数据 多个键及其关联的值有序的放在一起就是文档,MongoDB使用了Bson数据结构来存储数据和网络数据交换 BSON数据可以理解为在JSON的基础上添加了一些json没有的数据类型

MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

 

注意:

  • 文档的键/值对是有顺序的

  • 文档的键不能重复,如果重复,后面的会覆盖前面的键

  • MongoDB区分大小写和类型

  • 文档中的键一般是字符串

文档命名规范

  • 文档的键区分大小写

  • 文档的键不要使用\0和$

5.1 插入文档

(1) insert的插入一条文档

语法:db.集合名.insert(文档)
示例:db.user.insert({name:'tom',age:20})

(2) insert 插入多条文档

语法:db.集合名.insert([文档1,文档2,...文档2])
示例:db.user.insert([{name:'武大郎',age:30},{name:'和珅',age:20}])
  • 注意:如果没有中括号 那么只会将第一条数据 插入成功

(3) save

语法:db.集合名.save(文档)
说明:如果不指定_id字段,save()方法类似于insert()方法。如果指定_id字段,则会更新_id字段的数据
示例1:db.student.save({name:"科比", age:22,address:"洛杉矶"})
示例2:db.student.save({_id:ObjectId("59950962019723fe2a0d8d17"),name:"姚明", age:23,address:"休斯顿"})

(4)3.2版本以后 建议使用

语法:db.collection.insertOne()
示例:db.user.insertOne({name:'萧峰',age:30})
​
语法:db.collection.insertMany()
示例:db.user.insertMany([{name:'武大郎',age:30},{name:'和珅',age:20}])

5.2 REMOVE文档删除

语法: 
db.collection.remove(<query>,<justOne>
)
参数说明:query:可选,删除的文档的条件justOne:可选,如果为true或1,则只删除一个文档
示例:db.user.remove({name:'武大郎'},1) #会删除第一个匹配到的文档db.user.remove({name:"张三"})      #删除多条文档db.collection.remove({})    #删除当前集合的全部文档
  • 3.2版本以后 建议使用

    • db.collection.deleteOne() #删除一条文档

    • db.collection.deleteMany() #删除多条文档

5.3 update 修改

语法:db.collection.update(条件,修改的操作,{upsert:bool,multi:bool})   
说明:upsert:可选,如果不存在修改的记录,是否当新数据插入,true为插入,False为不插入,默认为falsemulti:可选,默认是false,只更新找到的第一条记录;如果为true,就按照条件查找出来的数据全部更新 
示例:$set   直接修改$inc   累加修改
db.user.update({name:"潘金莲"},{$set:{age:20}})   #把name为潘金莲的文档的age直接改为20  
db.user.update({name:"潘金莲"},{$inc:{age:20}}) #把name为潘金莲的文档的age加上20 
全部修改:db.user.update({name:"王五"},{$inc:{age:3}},{multi:true})
  • 3.2版本以后 建议 updateOne() 只更新一条 updateMany() 更新多条

5.4 FIND 查询

(1) 基本查询

语法:db.collection.find() 查询所有
语法:db.collection.find({条件},{key:1 [,key2:1]})  按照条件来查询  设置为1则显示
语法:db.collection.find({条件},{key1:0[,key2:0]})  按照条件来查询  设置为0则不显示
​
示例:db.user.find({name:"王五"},{name:1})   #查询所有name为王五的文档 只显示name的值
示例:db.user.find({name:"王五"},{name:0})   #查询所有name为王五的文档 显示name键值对以外的所有的值
示例:db.user.find({},{key:1})     #条件是 查询所有 只显示某个键值对
  • 注意:

错误写法:db.user.find({name:"王五"},{age:1,name:0}) 要么指定显示,要么指定不显示,不可以混合
正确写法:db.user.find({name:"王五"},{_id:0,name:1}) #id隐藏,只显示name的键值对,除了设置系统的_id 可以混搭外 其它都不可以

(2) findOne 查询一条数据

语法:db.collection.findOne({条件},{key1:1[key:1]})
示例:db.user.findOne({name:'和珅'},{name:1})

(3) pretty 展开显示

db.collection.find().pretty() #只有当文档一行显示不下(比较长的时候) 会展开显示

(4) 统计count

db.collection.find().count()  统计所有文档的条数
db.user.find({name:"王五"}).count() 统计满足条件的文档的条数

(5) 条件运算

操作符说明使用
$gt大于db.user.find({age:{$gt:30}},{age:1})年龄>30
$gte大于等于db.user.find({age:{$gte:30}},{age:1})年龄>=30
$lt小于db.user.find({age:{$lt:30}},{age:1})年龄<30
$lte小于等于db.user.find({age:{$lte:30}},{age:1})年龄<=30
键:值等于db.user.find({age:30})
 >= and <=db.user.find({age:{$gte:25,$lte:35}})
_id:objectId()id来查询db.user.find({"_id" : ObjectId("5a162218fa08a5e7ad2ad09c")})
/数据/模糊查询db.user.find({name:/李/}) 名字包含李的
/^数据/以数据作为开头db.user.find({name:/^李/})
/数据$/以数据作为结尾db.user.find({name:/五$/})
$in在...范围之内db.user.find({age:{$in:[23,30]}})
$nin不在...范围之内db.user.find({name:{$nin:['王五','赵六']}})
$ne不等于db.user.find({name:{$ne:'王五'}})

(6)逻辑运算

1.and   逻辑与查询
语法:db.集合名.find({条件1,条件2,……,条件n})
示例:db.user.find({name:'赵六',age:54})     查询 name为赵六 并且 age为54的文档db.user.find({name:"赵六",age:{$gt:40}})    查询name为赵六 并且年龄大于40
2.or 逻辑或
语法:db.集合名.find({$or:[{条件1},{条件2},……,{条件n}]})
示例:db.user.find({$or:[{name:"王五"},{age:40}]})   查询name为王五 或者age为40的文档db.user.find({$or:[{name:"王五"},{name:"赵六"}]})      查询name为王五或者赵六的所有文档
3. and和or联合使用
语法: db.collection.find( { 条件1,条件2,... $or:[ {条件1} , {条件2}]  })
示例:db.user.find({name:"王五",$or:[{age:30},{age:40}]})查询name为 王五 年龄为30或者40的所有文档
db.user.find({name:'XAD',$or:[{age:66},{age:68}]})
#name='XAD' and (age = 66 or age =68)

(7) limit 和skip

limit用法:
语法:db.collection.find().limit(num)  #取前num条数据
示例:db.user.find().limit(3)   #取三条数据
​
skip用法
语法:db.collection.skip(num)   #跳过num条文档
示例:db.user.find().skip(9)  #跳过9条数据
​
skip 和 limit 配合使用  是分页技术的基础
语法:db.collection.find().skip(num).limit(num)
示例:db.user.find().skip(8).limit(1)   #跳过8条数据 取1条, 其实就是实现了limit m,n

(8) 排序sort

语法:db.collection.find().sort(key:1/-1)  #按照key的升序(1)/降序(-1)  
示例:db.user.find().sort({age:-1})   按照年龄 降序显示db.user.find().sort({age:-1}).limit(1)  #取出一条年龄最大的文档

六、 数据库的备份

(1) 备份

语法:mongodump -h 主机 -u 用户名 -p 密码 -d 数据库 -c 集合 -o 备份目录
示例:mongodump -d bbs -o ./  备份bbs库到当前目录,会生成一个和库名相同的目录mongodump -o ./  备份所有数据库
导出集合为json文件:mongoexport -d bbs -c user -o ./user.json

(2) 恢复

语法:mongorestore --drop -d dir/ 恢复所有库   --drop是当恢复时先把之前的数据删除,不建议使用
语法:mongorestore -d mydbdir/   mydbdir就是你数据库备份的目录
语法:mongorestore -d mydb -c test dir/mydb/test.bson  恢复集合

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/455992.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP 函数截图 哈哈哈

转载于:https://www.cnblogs.com/bootoo/p/6714676.html

python中的魔术方法

魔术方法 魔术方法就是一个类/对象中的方法&#xff0c;和普通方法唯一的不同时&#xff0c;普通方法需要调用&#xff01;而魔术方法是在特定时刻自动触发。 1.__init__ 初始化魔术方法 触发时机&#xff1a;初始化对象时触发&#xff08;不是实例化触发&#xff0c;但是和实…

2016年光伏电站交易和融资的十大猜想

1领跑者计划备受关注&#xff0c;竞价上网或从试点开始 领跑者计划规模大&#xff0c;上网条件好&#xff0c;又有政府背书&#xff0c;虽说价格也不便宜&#xff0c;但省去很多隐性成本&#xff0c;对于致力于规模化发展的大型企业来说仍是首要选择。同时&#xff0c;从能源管…

loading gif 透明_搞笑GIF:有这样的女朋友下班哪里都不想去

原标题&#xff1a;搞笑GIF&#xff1a;有这样的女朋友下班哪里都不想去这样的广场舞看着不凉快吗&#xff1f;大哥慢点&#xff0c;机器经受不住你这样的速度求孩子的心里阴影面积生孩子就是用来玩的。有这样的媳妇做饭&#xff0c;下班哪里也不想去1.领导在门外用门夹核桃&am…

Redis数据库 【总结笔记】

一、NoSql&#xff08;非关系型数据库&#xff09; NoSQL&#xff1a;NoSQL Not Only SQL 非关系型数据库 ​ NoSQL&#xff0c;泛指非关系型的数据库。随着互联网web2.0网站的兴起&#xff0c;传统的关系数据库在应付web2.0网站&#xff0c;特别是超大规模和高并发的SNS类型…

基于IP的H.264关键技术

一、 引言 H.264是ITU-T最新的视频编码标准&#xff0c;被称作ISO/IEC14496-10或MPEG-4 AVC&#xff0c;是由运动图像专家组(MPEG)和ITU的视频编码专家组共同开发的新产品。H.264分两层结构&#xff0c;包括视频编码层和网络适配层。视频编码层处理的是块、宏块和片的数据&…

“光伏进社区” 应及早谋划布局

所谓“光伏进社区”就是全国城乡居民家庭大批量的利用家庭光伏系统&#xff0c;甚至出现光伏的社区化联网交换、合作等更深入的活动。虽然“光伏进社区”还有很长的路要走&#xff0c;但“光伏进社区”的各种经济、技术、社会条件正越来越向有利方向发展。 城乡居民集聚社区是光…

python中的装饰器和抽象类

装饰器和抽象类 装饰器就是对函数或者方法或者类进行修饰 #第一步&#xff1a;创建一个普通函数 def laxi():print(噗哧噗哧噗哧噗哧&#xff5e;&#xff5e;&#xff5e;)#调用函数 laxi() laxi()#第二步&#xff1a;扩展函数的功能(不是装饰器) #声明一个扩展函数 def deco…

eigen库安装_OpenCV+Eigen上位机程序移植(七十一)

1、给硬盘分区现在小伙伴们对于给电脑硬盘分区想必比较头疼&#xff0c;给电脑硬盘分区分为两种情况&#xff0c;一是在安装系统之前给系统硬盘分区&#xff0c;二是在安装系统之后给硬盘分区&#xff0c;我们现在购买的品牌机和笔记本的用户比较多&#xff0c;而且笔记本和品牌…

【实战操作】使用FFmpeg将一个视频文件中音频合成到另一个视频中 只需三秒

直接进入主题 主要参数&#xff1a; -i——设置输入文件名。-f——设置输出格式。-y——若输出文件已存在时则覆盖文件。-fs——超过指定的文件大小时则结束转换。-t——指定输出文件的持续时间&#xff0c;以秒为单位。-ss——从指定时间开始转换&#xff0c;以秒为单位。-t从…

苹果依旧强大 物联网领域举足轻重

近几天科技界最火爆的话题就是苹果和谷歌两家公司&#xff0c;一是苹果发布财报&#xff0c;二是谷歌人工智能围棋战胜欧洲冠军以及谷歌母公司Alphabet或将超越苹果&#xff0c;成为世界上市值最大的公司。而在我眼里&#xff0c;未来五年内依然属于苹果。回顾下苹果公司公布的…

linux之SQL语句简明教程---SUBSTRING

SQL 中的 substring 函数是用来抓出一个栏位资料中的当中一部分。这个函数的名称在不同的资料库中不全然一样&#xff1a; MySQL: SUBSTR( ), SUBSTRING( )Oracle: SUBSTR( )SQL Server: SUBSTRING( )最经常使用到的方式例如以下 (在这里我们用 SUBSTR( ) 为例)&#xff1a; SU…

H.264/AVC技术进展及其务实发展策略思考

随着NGN、3G及3G演进和NGBW等对视频、多媒体业务与网络应用的飞速发展需求&#xff0c;作为视频业务及存储应用核心技术的高效率 视频数字压缩编(译码)技术&#xff0c;愈来愈引起人们的关注&#xff0c;成为目前广播、视频与多媒体通信领域中的亮点与热点。制定视频编码标准的…

python中错误和异常处理

错误和异常处理 在python中一共有2种错误&#xff1a;一种是语法错误&#xff0c;另外一种是异常。 语法错误 语法错误也叫做解析错误&#xff0c;是指python无法正确的识别代码的造成的。根本原因在于人的行为&#xff1a;手残&#xff0c;脑残和眼残的行为。 解决方法&#x…

listview 每行后面的小箭头_主卧带小衣帽装修,这几个装修方案,你喜欢哪个?...

南京装修交流圈 - 知乎​www.zhihu.com现在大部分人购买的房子面积还是普遍偏小的&#xff0c;每行每业都有自己的服装讲究&#xff0c;不同的场地、见不同的人等等。家中能有一个衣帽间自然也就是心中所向往和追求的。能够有独立的一个房间来做衣帽间当然更好&#xff0c;今天…

【养成好习惯】使用pipreqs导出本项目使用的环境

pipreqs pipreqs可以帮你找到当前项目的所有组件及其版本。就是当别人给你一个程序的时候&#xff0c;你要在自己电脑上运行起来&#xff0c;就需要安装程序所依赖的组件&#xff0c;总不能自己一个一个找吧。 # 安装 pip install -i https://pypi.tuna.tsinghua.edu.cn/simpl…

开放医疗交通大数据技术 服务于公共便民领域

孙丕恕还建议&#xff0c;交通拥堵的数据也可以开放&#xff0c;孙丕恕介绍&#xff0c;目前已有导航软件有部分数据&#xff0c;但还有些滞后&#xff0c;如果能够做到实时更新数据&#xff0c;那么也可以为出行者避开拥堵&#xff0c;节约时间。此外&#xff0c;如果二手车的…

Nagios_在不同平台下的安装

Nagios 是一款开源的免费网络监视工具&#xff0c;致力于打造符合行业标准的 IT 基础架构的监控系统。Nagios 提供了服务器、网络和应用的完整的 IT 监控和报警&#xff0c;可以有效监控 Windows、Linux 和 Unix 的主机状态&#xff0c;以及交换机、路由器、打印机等网络设备。…

python中的模块和包

模块和包 一个模块就是一个包含python代码的文件。一个文件就是一个模块 为什么要使用模块 1.现在程序开发文件比较大&#xff0c;都放在一个文件中维护不方便&#xff0c;拆分成多个文件方便维护与管理 2.模块可以增加代码的重用率 3.模块可以当作命名空间如何定义自己的模块 …

2005年全球H.264编解码器荟萃

2005年全球H.264编解码器荟萃videosky.9126.com Peter Lee 2005-0920【摘要】H.264/AVC作为最新的视频编码标准&#xff0c;研究领域和产业界都非常看好该标准。尤其是产业界&#xff0c;针对H.264的软硬件编解码器可谓是百花齐放、百家争鸣。本文中&#xff0c;笔者对2005年全…