基础

概念

sql概念mongodb概念说明
databasedatabase数据库
tablecollection数据库表/集合
rowdocument数据记录行/文档
columnfield数据字段/域
indexindex索引
table joins表连接,mongodb不支持
object嵌入文档mongodb通过嵌入式文档替代多表连接
primary keyprimary 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”)}

基本命令

数据库相关

  1. 查看所有数据库

show databases

  1. 选择数据库(如果数据库不存在,不会报错;会隐式创建:当后期该数据库有数据时自动创建)

use 数据库名

  1. 删除数据库(先选中数据库)

db.dropDatabase()

集合相关

  1. 查看所有集合

show collections

  1. 创建集合(插入数据会隐式创建)

db.createCollection(‘集合名’)

  1. 删除集合

db.集合名.drop()

CRUD

插入文档

集合存在则直接插入数据,不存在则隐式创建集合并插入数据

json数据格式要求key得加"",但这里为了方便查看,对象的key统一不加"";查看集合数据时系统会自动给key加""

mongodb会自动给每条数据创建全球唯一的_id键(我们也可以自定义_id的值,只要给插入的json数据增加_id键即可覆盖,但是不推荐这样做)

db.集合名.insert(json数据)

1
2
3
for (var i = 1; i < 10; i++) {
    db.student.insert({name: "a" + i, age: i})
}

删除文档

db.集合名.remove(条件 [,是否删除一条])

是否删除一条:

false删除多条,即全部删除(默认)

true删除一条

修改文档

db.集合名.update(条件, 新数据 [,是否新增, 是否修改多条])

新数据:默认是对原数据进行替换,若要进行修改,格式为 {修改器:{key:value}}

是否新增:条件匹配不到数据时是否插入: true插入,false不插入(默认)

是否修改多条:条件匹配成功的数据是否都修改: true都修改,false只修改一条(默认)

修改器:$inc 递增;$rename 重命名列;$set 修改列值;$unset 删除列

示例:

准备工作:插入十条数据

1
2
3
for (var i = 1; i <= 10; i++) {
    db.people.insert({name: "zsr" + i, age: i})
}

将{name:“zsr1”}更改为{name:“zsr2”}

1
db.people.update({name: "zsr1"}, {name: "zsr2"})

发现问题:默认不是修改而是替换

解决问题:使用修改器将{name:“zsr3”}更改为{name:“zsr3333”}

1
db.people.update({name: "zsr3"}, {$set: {name: "zsr3333"}})

给{name:“zsr10”}的年龄增加或减少2岁

增加两岁:

1
db.people.update({name: "zsr10"}, {$inc: {age: 2}})

减少两岁:

1
db.people.update({name: "zsr10"}, {$inc: {age: -2}})

一次写多个修改器

首先插入一条数据

1
db.people.insert({username: "gcc", age: 20, sex: "女", address: "unknown"})

修改gcc的username为bareth,age+11,sex字段重命名为sexuality,删除address字段

1
2
3
4
5
6
db.people.update({username: "gcc"}, {
    $set: {username: "bareth"},
    $inc: {age: 11},
    $rename: {sex: "sexuality"},
    $unset: {address: true}
})

查询文档

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)*每页显示的条数

示例:

1
2
3
4
5
6
7
for (var i = 1; i < 11; i++) {
    db.page.insert({_id: i, name: "p" + i})
}

for (var i = 0; i < 10; i = i + 2) {
    db.page.find().skip(i).limit(2)
}

聚合查询

语法

db.集合名.aggregate([
{管道:{表达式}}

])

常用管道:

$group 将集合中的文档分组,用于统计结果

$match 过滤数据,只输出符合条件的文档

$sort 聚合数据进一步排序

$skip 跳过指定文档数

$limit 限制集合数据返回文档数

常用表达式:

s u m 总和( sum 总和(sum总和(num:1同count表示统计)

$avg 平均

$min 最小值

$max 最大值

示例:

统计男生、女生的总年龄

1
2
3
db.people.aggregate([
    {$group: {_id: "$sex", age_sum: {$sum: "$age"}}}
])

统计男生女生的总人数

1
2
3
db.people.aggregate([
    {$group: {_id: "$sex", sum: {$sum: 1}}}
])

求学生总数和平均年龄

1
2
3
db.people.aggregate([
    {$group: {_id: null, total_num: {$sum: 1}, total_avg: {$avg: "$age"}}}
])

查询男生、女生人数,按人数升序

1
2
3
4
db.people.aggregate([
    {$group: {_id: "$sex", rs: {$sum: 1}}},
    {$sort: {rs: 1}}
])

索引

创建索引

db.集合名.createIndex(待创建索引的列:方式 [,额外选项])

创建复合索引

db.集合名.createIndex({key1:方式,key2:方式} [,额外选项])

参数说明:

待创建索引的列:方式:{key:1}/{key:-1}

1表示升序,-1表示降序; 例如{age:1}表示创建age索引并按照升序方法排列

额外选项:设置索引的名称或者唯一索引等

设置名称:{name:索引名}

唯一索引:{unique:列名}

删除全部索引

db.集合名.dropIndexes()

删除指定索引

db.集合名.dropIndex(索引名)

查看索引

db.集合名.getIndexes()

练习:

给name添加普通升序索引

1
db.data.createIndex({name: 1})

给age创建索引并起名age_up

1
db.data.createIndex({age: 1}, {name: "age_up"})

删除name列的索引

1
db.data.dropIndex("name_1")

给name和age添加组合索引

1
db.data.createIndex({name: 1, age: 1})

给name创建唯一索引

1
db.data.createIndex({name: 1}, {unique: "name"})

分析索引(explain)

1
db.集合名.find().explain("executionStats")

权限

创建账号

1
2
3
4
5
6
7
8
db.createUser({
    "user": "账号",
    "pwd": "密码",
    "roles": [{
        role: "角色",
        db: "所属数据库"
    }]
})

角色种类

超级用户角色:root 数据库用户角色:read、readWrite 数据库管理角色:dbAdmin、userAdmin 集群管理角色: clusterAdmin、clusterManager、clusterMonitor、hostManager 备份恢复角色: backup、restore 所有数据库角色: readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase

角色说明

root:只在admin数据库中可用。超级账号,超级权限; read:允许用户读取指定数据库; readWrite:允许用户读写指定数据库 开启验证模式 验证模式:值用户需要输入账号密码才能登录使用

添加超级管理员账号

必须使用admin数据库

1
2
use
admin

创建超级用户

1
2
3
4
5
6
7
8
db.createUser({
    "user": "zsr",
    "pwd": "123456",
    "roles": [{
        role: "root",
        db: "admin"
    }]
})

查看admin数据库中的集合system.users可以查看详细信息