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

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

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

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

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

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…

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;如果二手车的…

【Tensorflow】基于卷积神经网络实现车牌的识别

引言&#xff1a; 过去几周我一直在涉足深度学习领域&#xff0c;尤其是卷积神经网络模型。最近&#xff0c;谷歌围绕街景多位数字识别技术发布了一篇不错的paper。该文章描述了一个用于提取街景门牌号的单个端到端神经网络系统。然后&#xff0c;作者阐述了基于同样的网络结构…

脚本启动显示查询频繁被服务器防御_面对CC攻击,该如何进行防御

网站被攻击是一件十分让人恼火的事情&#xff0c;不仅仅是让网站速度变慢、访问异常&#xff0c;导致用户体验变差&#xff0c;用户大量流失&#xff0c;而且还会导致网站关键词排名下降甚至被降权&#xff0c;极大干扰了网站的正常稳定运行。那面对CC攻击&#xff0c;该如何进…

PAT甲题题解-1011. World Cup Betting (20)-误导人的水题。。。

题目不严谨啊啊啊啊式子算出来结果是37.975样例输出的是37.98我以为是四舍五入的啊啊啊&#xff0c;所以最后输出的是sum0.005结果告诉我全部错误啊结果直接保留两位小数就可以了啊啊啊啊 水题也不要这么坑人啊啊啊啊 #include <iostream> #include <algorithm> #i…

【Django】文件上传以及celery的使用

上传文件、异步、初始化脚本 面试题&#xff1a; 项目中的静态文件处理&#xff08;JS/CSS/image&#xff09; 自己在机房内优化的方法&#xff1a;1. Nginx/lighttpd(lighty-douban)&#xff1a;Nginx 处理静态资源速度非常快&#xff0c;并且自身还带有缓存。2. 80: Nginx -&…

Android 查看每个应用的最大可用内存

http://blog.csdn.net/vshuang/article/details/39647167 Android 内存管理 &Memory Leak & OOM 分析 单个应用可用的最大内存 Android设备出厂以后&#xff0c;java虚拟机对单个应用的最大内存分配就确定下来了&#xff0c;超出这个值就会OOM。这个属性值是定义在…

分析一段H264视频数据

分析一段H264视频数据 Posted on 2007-05-31 09:42 vcommon 阅读(1968) 评论(8) 编辑 收藏 引用 分析 00 00 00 01 67 42 00 1E 99 A0 B1 31 00 00 00 01 H264的数据流分为两种&#xff0c;一种是NAL UNIT stream(RTP),一种是 bits stream, 两者可以互相转换。我们分析的这个…

springboot springmvc mybatis_12道重点的Spring Boot面试题,帮你整理好了!

今天跟大家分享下SpringBoot常见面试题的知识。最新2020整理收集的一些面试题&#xff08;都整理成文档&#xff09;&#xff0c;有很多干货&#xff0c;包含mysql&#xff0c;netty&#xff0c;spring&#xff0c;线程&#xff0c;spring cloud等详细讲解&#xff0c;也有详细…

【数据分析】快速获取微博用户数据,图片,视频

功能输出实例运行环境使用说明 下载脚本安装依赖程序设置设置数据库&#xff08;可选&#xff09;运行脚本按需求修改脚本&#xff08;可选&#xff09; 如何获取user_id添加cookie与不添加cookie的区别&#xff08;可选&#xff09;如何获取cookie&#xff08;可选&#xff09…

“云计算”越来越重要 但更重要的是“云安全”

据Gartner公司的预测&#xff0c;云安全服务业务继续保持强劲&#xff0c;2017年最终将达到59亿美元的规模&#xff0c;比2016年上涨了21&#xff05;。 云安全服务市场的增长速度将超过整体信息安全市场。Gartner表示&#xff0c;电子邮件的安全性&#xff0c;网络安全和身份识…

H.264的两个概念:DC系数和AC系数。 MV预测过程详解(附图)

在做熵编码之前&#xff0c;先明确两个概念&#xff1a;DC系数和AC系数。 量化后得到的仍是64个系数&#xff0c;量化并没有改变系数的性质。大家知到DCT变换是将数据域从时&#xff08;空&#xff09;域变换到频域&#xff0c;在频域平面上变换系数是二维频域变量u和v的函数。…