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(索引名)
数据备份
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:'123',
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: '456'})
2. 修改角色
db.updateUser('用户名',{roles:[{role: 'read',db:'demo'}]})
网友评论