基础
概念
sql概念 | mongodb概念 | 说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 无 | 表连接,mongodb不支持 |
object | 嵌入文档 | mongodb通过嵌入式文档替代多表连接 |
primary key | primary key | 主键,mongodb自动将_id字段设置为主键 |
BSON数据类型
数据类型 | 描述 | 举例 |
---|---|---|
字符串 | UTF-8编码的字符串 | {“x”:“foobar”} |
对象id | 文档唯一id | {“x”:Objectid()} |
布尔值 | trur/fales(不可双引号) | {“x”:true} |
数组 | 值的集合或者列表 | {“x”:[“a”,“b”]} |
64位浮点数 | 数字都是这个类型 | {“x”:3.14,“y”:3} |
null | 表示空值或未定义对象 | {“x”:null} |
undefined | 文档中也可以使用未定义类型 | {“x”:undefined} |
正则表达式 | 使用js的正则表达式语法 | {“x”:/foobar/i} |
代码 | 可包含js语法 | {“x”:function(){}} |
shell默认使用64位浮点型数值。{“x”:3.14或{“x”:3}。对于整型值,可以使用NumberInt(4字节符号整数)或 NumberLong(8字节符号整数),{“x”:NumberInt(“3” ){“x”:NumberLong(“3”)}
基本命令
数据库相关
- 查看所有数据库
show databases
- 选择数据库(如果数据库不存在,不会报错;会隐式创建:当后期该数据库有数据时自动创建)
use 数据库名
- 删除数据库(先选中数据库)
db.dropDatabase()
集合相关
- 查看所有集合
show collections
- 创建集合(插入数据会隐式创建)
db.createCollection(‘集合名’)
- 删除集合
db.集合名.drop()
CRUD
插入文档
集合存在则直接插入数据,不存在则隐式创建集合并插入数据
json数据格式要求key得加"",但这里为了方便查看,对象的key统一不加"";查看集合数据时系统会自动给key加""
mongodb会自动给每条数据创建全球唯一的_id键(我们也可以自定义_id的值,只要给插入的json数据增加_id键即可覆盖,但是不推荐这样做)
db.集合名.insert(json数据)
|
|
删除文档
db.集合名.remove(条件 [,是否删除一条])
是否删除一条:
false删除多条,即全部删除(默认)
true删除一条
修改文档
db.集合名.update(条件, 新数据 [,是否新增, 是否修改多条])
新数据:默认是对原数据进行替换,若要进行修改,格式为 {修改器:{key:value}}
是否新增:条件匹配不到数据时是否插入: true插入,false不插入(默认)
是否修改多条:条件匹配成功的数据是否都修改: true都修改,false只修改一条(默认)
修改器:$inc 递增;$rename 重命名列;$set 修改列值;$unset 删除列
示例:
准备工作:插入十条数据
|
|
将{name:“zsr1”}更改为{name:“zsr2”}
|
|
发现问题:默认不是修改而是替换
解决问题:使用修改器将{name:“zsr3”}更改为{name:“zsr3333”}
|
|
给{name:“zsr10”}的年龄增加或减少2岁
增加两岁:
|
|
减少两岁:
|
|
一次写多个修改器
首先插入一条数据
|
|
修改gcc的username为bareth,age+11,sex字段重命名为sexuality,删除address字段
|
|
查询文档
db.集合名.find(条件 [,查询的列])
db.集合名.find(条件 [,查询的列]).pretty() #格式化查看
条件:
查询所有数据:{}或不写;
查询指定要求数据:{key:value}或{key:{运算符:value}}
查询的列(可选参数)
不写则查询全部列
{key:1} 只显示key列
{key:0} 除了key列都显示
注意:_id列都会存在
运算符
$gt 大于
$gte 大于等于
$lt 小于
$lte 小于等于
$ne 不等于
$in in
$nin not in
查询指定列的所有数据(0不返回字段,1返回字段)
db.collection_name.find({}, {列名:0/1})
查询指定条件的数据
db.collection_name.find({ 字段: { 运算符: 条件 } })
排序
db.集合名.find().sort(json数据)
json数据(key:value):key就是要排序的字段,value为1表示升序,-1表示降序
分页
db.集合名.find().sort().skip(数字).limit(数字)[.count()]
skip(数字),指定跳过的数量(可选)
limit(数字),限制查询的数量
count(),统计数量
skip计算公式: (当前页-1)*每页显示的条数
示例:
|
|
聚合查询
语法
db.集合名.aggregate([
{管道:{表达式}}
…
])常用管道:
$group 将集合中的文档分组,用于统计结果
$match 过滤数据,只输出符合条件的文档
$sort 聚合数据进一步排序
$skip 跳过指定文档数
$limit 限制集合数据返回文档数
常用表达式:
s u m 总和( sum 总和(sum总和(num:1同count表示统计)
$avg 平均
$min 最小值
$max 最大值
示例:
统计男生、女生的总年龄
|
|
统计男生女生的总人数
|
|
求学生总数和平均年龄
|
|
查询男生、女生人数,按人数升序
|
|
索引
创建索引
db.集合名.createIndex(待创建索引的列:方式 [,额外选项])
创建复合索引
db.集合名.createIndex({key1:方式,key2:方式} [,额外选项])
参数说明:
待创建索引的列:方式:{key:1}/{key:-1}
1表示升序,-1表示降序; 例如{age:1}表示创建age索引并按照升序方法排列
额外选项:设置索引的名称或者唯一索引等
设置名称:{name:索引名}
唯一索引:{unique:列名}
删除全部索引
db.集合名.dropIndexes()
删除指定索引
db.集合名.dropIndex(索引名)
查看索引
db.集合名.getIndexes()
练习:
给name添加普通升序索引
|
|
给age创建索引并起名age_up
|
|
删除name列的索引
|
|
给name和age添加组合索引
|
|
给name创建唯一索引
|
|
分析索引(explain)
|
|
权限
创建账号
|
|
角色种类
超级用户角色:root 数据库用户角色:read、readWrite 数据库管理角色:dbAdmin、userAdmin 集群管理角色: clusterAdmin、clusterManager、clusterMonitor、hostManager 备份恢复角色: backup、restore 所有数据库角色: readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
角色说明
root:只在admin数据库中可用。超级账号,超级权限; read:允许用户读取指定数据库; readWrite:允许用户读写指定数据库 开启验证模式 验证模式:值用户需要输入账号密码才能登录使用
添加超级管理员账号
必须使用admin数据库
|
|
创建超级用户
|
|
查看admin数据库中的集合system.users可以查看详细信息