MangoDB学习笔记
01. 数据库操作
1. 查看当前数据库名称
db
2. 查看所有数据库名称,列出所有在物理上存在的数据库
show dbs;
3. 切换数据库,如果数据库不存在也并不创建,直到插入数据或创建集合时数据库才被创建
use 数据库名称
4. 删除当前指向的数据库,如果数据库不存在,则什么也不做
db.dropDatabase() 02. 集合操作
01. 创建集合
1. 不限制集合大小
db.createCollection(name)
2. 限制集合大小
db.createCollection(name, { capped : true, size : 10 } )
name 创建的集合名
capped 默认值为false表示不设置上限,值为true表示设置上限
size 当capped值为true时,需要指定此参数,表示上限大小,当文档达到上限时,会将之前的数据覆盖,单位为字节 02. 查看当前数据库的集合
show collections 03. 删除集合
db.集合名称.drop() 04. 当前集合的状态
db.集合名.stats() 03. 数据类型
Object ID 文档ID
每个文档都有一个属性,为_id,保证每个文档的唯一性
可以自己去设置_id插入文档
如果没有提供,那么MongoDB为每个文档提供了一个独特的_id,类型为objectID
objectID是一个12字节的十六进制数
前4个字节为当前时间戳
接下来3个字节的机器ID
接下来的2个字节中MongoDB的服务进程id
最后3个字节是简单的增量值
String 字符串,最常用,必须是有效的UTF-8
Boolean 存储一个布尔值,true或false
Integer 整数可以是32位或64位,这取决于服务器
Double 存储浮点值
Arrays 数组或列表,多个值存储到一个键
Object 用于嵌入式的文档,即一个值为一个文档
Null 存储Null值
Timestamp 时间戳,表示从1970-1-1到现在的总秒数
Date 存储当前日期或时间的UNIX时间格式
创建日期语句如下
注意:参数的格式为YYYY-MM-DD
new Date('2017-12-20') 04. 数据的增删改
1. 插入数据(可以不用事先创建集合而直接使用)
db.集合名称.insert(document) 2. 更新数据
db.集合名称.update(<query>, <update>, {multi: <boolean>})
query 查询条件
update:更新操作符,类似sql语句update中set部分
1. 当为一个文档时,则用这个文档替换查询到的文档
2. 通过$set更新指定的列{$set:{列:值}},如果列不存在,则会新添加一列。
3. 通过$unset删除指定的字段{$unset:{字段:''}} multi:可选,默认是false,表示只更新找到的第一条记录,值为true表示把满足条件的文档全部更新 3. 保存
db.集合名称.save(document)
如果document指定了_id,则修改,没有指定则添加到集合。 4. 删除数据
db.集合名称.remove(<query>, {justOne: <boolean>})
query 可选,删除的文档的条件
justOne 可选,如果设为true或1,则只删除一条,默认false,表示删除多条 05. 查询
01. 基本查询
1. db.集合名称.find({条件文档}) 根据条件查询
2. db.集合名称.findOne({条件文档}) 只查询一条数据
3. db.集合名称.find({条件文档}).pretty() 将结果格式化 02. 比较运算符
$lt 相当于< 例如:{age:{$lt:20}} 相当于age<20
$lte 相当于<=
$gt 相当于>
$gte 相当于>=
$ne 相当于!= 03. 逻辑运算符
1. 在{}中写的多个条件相当于and
{age:18, gerder:false} 相当于age=18 and gender=false
2. 或运算 $or
{$or:[{},{}...]} 所有条件写在[]中 04. 范围运算符
$in $nin
{age:{$in:[18,20]}} 相当于age=18或者age=20 05. 正则表达式
方法1:正则表达式放在//中
{name:/师$/} name以师结尾
方法2:
{name:{$regex:师$}} name以师结尾 06. 自定义查询
使用$where后面写一个js函数,返回满足条件的数据
对集合中所有的数据执行函数,如果返回true,则该条数据有效,否则过滤掉这条数据
如:
db.stu.find({
$where:function() {
return this.age > 30;
}
}) 07. 分页查询
db.集合名称.find().skip(m).limit(n)
跳过m条数据选择n条
其中skip()和limit()可以互换位置而不影响结果 08. 投影
在一条文档中选择其中的几个字段
db.集合名称.find({条件},{字段名称:1,...})
_id默认为显示,为0则表示不显示,其他字段若不想显示则不写即可,写为0反而会报错
1表示显示该字段 09. 排序
db.集合名称.find().sort({字段:1,...})
参数1表示升序
参数-1表示降序 10. 统计个数
写法1: db.集合名称.find({条件}).count()
写法2 db.集合名称.count({条件}) 11. 去重
db.集合名称.distinct('去重字段',{条件}) 06. 聚合
01. 介绍
聚合(aggregate)主要用于计算数据,类似sql中的sum()、avg()
02. 语法
db.集合名称.aggregate({管道:{表达式}})
管道 在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的输入;在mongodb中,管道具有同样的作用,文档处理完毕后,通过管道进行下一次处理
表达式 '$列表' 处理输入文档并输出 '$列表' 03. 常见管道
01. $group:将集合中的文档分组,可用于统计结果
_id 表示分组的依据,倘若写为Null,则把整个集合当做一组
如:统计男生女生的总人数
db.stu.aggregate(
{$group:
{
_id:'$gender',
counter:{$sum:1}
}
}
)
02. $match:过滤数据,只输出符合条件的文档
如:查询年龄大于20的男生、女生人数
db.stu.aggregate(
{$match:{age:{$gt:20}}},
{$group:{_id:'$gender',counter:{$sum:1}}}
) 03. $project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
如:查询男生、女生人数,输出人数
db.stu.aggregate(
{$group:{_id:'$gender',counter:{$sum:1}}},
{$project:{_id:0,counter:1}}
)
04. $sort:将输入文档排序后输出
如:查询男生、女生人数,按人数降序
db.stu.aggregate(
{$group:{_id:'$gender',counter:{$sum:1}}},
{$sort:{counter:-1}}
)
05. $limit:限制聚合管道返回的文档数
06. $skip:跳过指定数量的文档,并返回余下的文档
如:统计男生、女生人数,按人数升序,取第二条数据
db.stu.aggregate(
{$group:{_id:'$gender',counter:{$sum:1}}},
{$sort:{counter:1}},
{$skip:1},
{$limit:1}
)
注意:
聚合中的skip和limit顺序不能写反
07. $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值
1. 语法:
语法1. db.集合名称.aggregate({$unwind:'$字段名称'})
语法2
db.集合名称.aggregate({
$unwind:{
path:'$字段名称', #拆分的字段名
preserveNullAndEmptyArrays:<boolean> #防止数据丢失
}
}) 2. 解释
对于语法1,如果某条记录该字段为NULL,空数组或者没有该字段则这条记录就会丢弃不显示在结果集中
对于语法2,属性preserveNullAndEmptyArrays值为true表示保留属性值为空的文档,为false则丢弃 04. 常见表达式
$sum:计算总和,$sum:1 表示以一倍计数
$avg:计算平均值
$min:获取最小值
$max:获取最大值
$push:在结果文档中插入值到一个数组中,例如根据性别分组后,可以把当前性别这一组中的所有人的名字放到一个字段中
{$push:'$字段名'}
{$push:'$$ROOT'}将文档所有内容加入到结果集中
$first:根据资源文档的排序获取第一个文档数据
$last:根据资源文档的排序获取最后一个文档数据 07. 索引
1. 创建索引
1. 创建索引
db.集合.ensureIndex({属性:1})
参数1表示升序,-1表示降序 2. 创建多列索引
db.集合名.ensureIndex({属性1:1,属性2:1})
查找时,只有包含第一个属性,索引才会生效 3. 创建唯一索引
db.集合名.ensureIndex({属性:1},{unique:true})
集合中有重复数据无法创建
创建索引后仍可以插入重复数据 4.添加数据时,没有指定_id,自动创建_id,且给_id创建索引
2. 查看索引
db.集合名.getIndexes() 3. 删除索引
db.集合名.dropIndex(索引名) 08 数据备份
mongodump -h dbhost -d dbname -o dbdirectory
-h:服务器地址,也可以指定端口号,在本机上备份可以不用指定该项
-d:需要备份的数据库名称
-o:备份的数据存放位置,此目录中存放着备份出来的数据 09. 数据恢复
mongorestore -h dbhost -d dbname --dir dbdirectory
-h:服务器地址,在本机上备份可以不用指定该项
-d:需要恢复的数据库名
--dir:备份数据所在位置 10. 用户管理
MongoDB中创建用户,只能在某个数据库上创建用来管理这个数据库的指定角色的用户
常见角色:
root: 只在 admin 数据中可使用,超级账户,超级权限
Read: 允许用户读取指定的数据库
readWrite: 允许用户读写指定的数据库
1. 创建超级用户
use admin
db.createUser(
{
user:'admin',
pwd:'',
roles:[{role:'root',db:'admin'}]
}
) 2. 创建普通用户
1. 使用admin登录
2. use demo
3. db.createUser(
{
user:'用户名',
pwd:'密码'
roles:[{role:'readWrite',db:'demo'}]
}
) 3. 启用安全验证
1. 修改配置文件
vi /etc/mongod.conf
security:
authorization: enabled 2. 重启服务
sudo service mongod restart 4. 使用用户登录
mongo -u 用户名 -p 密码 --authenticationDatabase 数据库名 5. 修改用户
1. 修改密码
db.updateUser('用户名',{pwd: ''})
2. 修改角色
db.updateUser('用户名',{roles:[{role: 'read',db:'demo'}]})
MangoDB学习笔记的更多相关文章
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
- CSS学习笔记
CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...
- HTML学习笔记
HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...
- DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记
今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...
随机推荐
- WTL中最简单的实现窗口拖动的方法(转)
目前,很多基于对话框的应用程序中对话框都是不带框架的,也就是说对话框没有标题栏.众所周知,窗口的移动都是通过鼠标拖动窗口的标题栏来实现的,那么现在应用程序中的对话框没有了标题栏,用户如何移动对话框呢? ...
- java知识思维图解
- VMWare Station 问题汇总
1.开机黑屏,不启动系统 解决方法: 命令行窗口cmd—输入下面代码,然后重启计算机. netsh winsock reset 2.提示磁盘被锁无法打开 解决方法: 虚拟机目录下面的.lck文件都删了
- 【PMP】项目采购管理~重点知识
1.合同的类型与区别 固定总价(FFP):大多数买方都喜欢这种合同,因为货物的采购价格在一开始就已确定,并且不允许改变(除非工作范围发生变更) 总价加激励费用(FPIF):这种总价合同给买方和卖方提供 ...
- linux下使用mingw编译NSIS-3.03
简述 最近在研究使用NSIS做安装包,语法不算复杂,插件也很多,中文资料也不少,还挺好用的.先后用NSIS做出了安装和卸载需要输入密码,通过自定义页面实现安装时候选择多个目录.安装的时候输入配置文件信 ...
- 什么是同源策略,什么是跨域,如何跨域,Jsonp/CORS跨域
同源策略 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响. 可以说Web是构建在同源策略基础之上 ...
- 【Android】解析Paint类中MaskFilter的使用
目录结构: contents structure [+] EmbossMaskFilter BlurMaskFilter MaskFilter可以用来指定画笔的边缘效果.如果引用开启硬件加速的话,那么 ...
- Effective Java 第三版——53. 明智而审慎地使用可变参数
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...
- CentOS 7 安装配置zabbix 3.2.8
运行环境:CentOS 7.2 LNMP(已提前安装好此环境) 1.首先导入zabbix安装源# rpm -ivh http://repo.zabbix.com/zabbix/3.2/rhel/7/x ...
- 3D打印技术之切片引擎(5)
[此系列文章基于熔融沉积( fused depostion modeling, FDM )成形工艺] 从这一篇文章開始,就開始说填充.在3D打印切片技术中,填充算法是最核心的部分.3D打印技术的经常使 ...