数据库设计流程
- 确定功能所属集合
- 确定集合字段
三个必要字段: 创建于什么时候字段 更新于什么时候字段 状态字段
编号 学号 姓名 电话 性别 年龄 学历 备注
use school
// 插入数据
for (var num = 1; num <= 20; num++){
db.stu.insert({
id: num,
no: "XX" + num,
uname: "小学一年级" + num + "号",
tel: "11111111111",
sex: "男" ,
age: num,
school: "小学生",
remark: "备注内容111"
})
}
db.stu.find().pretty() // 格式化显示信息
排序和分页
使用数据
use test3
db.c1.insert({id: 1, name: "a", sex: 1, age: 1})
db.c1.insert({id: 2, name: "a", sex: 1, age: 1})
db.c1.insert({id: 3, name: "b", sex: 2, age: 2})
db.c1.insert({id: 4, name: "c", sex: 2, age: 3})
db.c1.insert({id: 5, name: "d", sex: 2, age: 4})
db.c1.find()
排序
语法:
db.集合名.find().sort(JSON数据)
说明:
键:要排序的列/字段
值:1 升序 -1 降序
例子:
db.c1.find().sort({age: -1}) // 降序
db.c1.find().sort({age: 1}) // 升序
扩展方法
语法:
db.集合名.find().sort().skip(数字).limit(数字)
|- db.集合名.find().sort().skip(数字)
|- db.集合名.find().sort().limit(数字)
db.集合名.find().count()
说明:
skip指跳过指定的数量数据
limit指限制每次查询的数量数据
count()统计总数量
例子:
db.c1.find().sort({age: -1}).skip(0).limit(2) // 查询 前两条 降序排序 的结果
db.c1.find().sort({age: -1}).skip(2).limit(2) // 查询 跳过两条数据后 的 前两条 降序排序 的结果
分页使用:
例子:数据库1-10的数据,每页显示两条(5页)
skip计算公式: (当前页) - 1 * 煤业显示条数
limit值: 2
聚合查询
语法:
db.集合名.aggregate([
{管道: {表达式}}
...
])
常用管道:
$group
$match 过滤数据,
$sort 集合数据进一步排序
$skip 跳过指定文档数
$limit 限制集合数据返回文档数
常用表达式:
$sum 总和 $sum:1表示统计总数量
$avg 平均
$min 最小值
$max 最大值
例子:
数据:
use test4
db.c1.insert({id: 1, name: 'a', sex: 1, age: 1})
db.c1.insert({id: 2, name: 'a', sex: 1, age: 2})
db.c1.insert({id: 3, name: 'b', sex: 2, age: 3})
db.c1.insert({id: 4, name: 'c', sex: 2, age: 4})
db.c1.insert({id: 5, name: 'd', sex: 2, age: 5})
统计各个性别的总年龄
db.c1.aggregate([
{
$group: {
_id: '$sex', // 固定字段
rs: {$sum: '$age'}
}
}
])
统计各个性别的总人数
db.c1.aggregate([
{
$group: {
_id: '$sex',
rs: {$sum: 1}
}
}
])
总人数和平均年龄
db.c1.aggregate([
{
$group: {
_id: null,
total_num: {$sum: 1},
total_avg: {$avg: '$age'}
}
}
])
查询各个性别人数,并按照人数升序
db.c1.aggregate([
{
$group: {
_id: '$sex',
rs: {$sum: 1}
}
},
{
$sort: {
rs: -1
}
}
])
索引
索引是一种排序好的便于快速查询的数据结构
作用:帮助数据库快速查询
优点:
提高数据查询的效率,降低数据库的IO成本
通过索引对数据进行排序,降低数据排序的成本,降低CPU的消耗
缺点:
占用磁盘空间
大量索引影响SQL语句效率,因为每次插入和修改数据都需要更新索引
创建索引:
db.集合名.createIndex(待创建索引的列[, 额外选项])
参数:
待创建索引的列:{键: 1,..., 键: -1}
1:升序;-1:降序;
例如: {age: 1} 表示创建age索引并按照升序的方式存储
额外说明:设置索引的名称或唯一索引值等
部分额外选项用法:
定义索引名: db.集合名.createIndex(待创建索引的列, {name: 索引名})
创建唯一索引: db.集合名.createIndex(待创建索引的列, {unique: true})
【默认false,创建唯一索引后,索引具有唯一性,该列不允许出现新增出现重复内容】
删除索引
删除全部:
db.集合名.dropIndexes()
删除指定:
db.集合名.dropIndex(索引名)
查看索引
db.集合名.getIndexes()
分析索引
检查索引搜索结果的状态
db.集合名.find().explain('executionStats')
索引选择原则(如何选择合适的列创建索引)、
- 为常做条件、排序、分组、联合操作的字段建立索引
- 选择唯一性索引(如:性别【只有男女】)
- 选择较小的数据列,为较长的字符串使用前缀索引(索引文件更小)
示例:
use test5
for(var i = 0; i < 10000; i++) {
db.c1.insert({'name': 'aaa' + i, 'age': i})
}
db.c1.createIndex({name: 1}) // 创建name列的索引,并为升序
db.c1.getIndexes() // 查询c1的所有索引
db.c1.dropIndex('name_1') // 删除名称为name_1的索引
db.c1.createIndex({name: 1}, {name: 'webopenfather'}) // 创建name列的索引,并为升序,且索引名为webopenfather
db.c1.createIndex({name: 1, age: 1}) // 创建name列和age列的组合索引
db.c1.createIndex({name: 1}, {unique: true}) // 创建唯一索引 默认false
权限机制
语法:
db.createUser({
"user": "账号",
"pwd": "密码",
"roles": [{
role: "角色",
db: "所属数据库"
}]
})
开启验证模式
指需要用户输入账号密码才能登陆使用
操作步骤:
- 添加超级管理员
db.createUser({
"user": "admin",
"pwd": "admin888",
"roles": [{
role: "root",
db: "admin"
}]
})
- 退出卸载服务(cmd窗口需要用管理员运行)
mongodb/bin目录下:mongod --remove
- 重新安装需要输入账号密码的服务(在原安装命令的基础上加上--auth即可)
mongodb/bin目录下:mongod --install --dbpath mongodb\data目录 --logpath log目录\不重复的日志文件.log
net start mongodb
通过超级管理员账号登陆
方法1:
mongo服务器IP地址: 端口号/数据库 -u 用户名 -p 密码
方法2:
a 先登录
mongo
b 选择数据库
use admin
c 输入db.path(用户名, 密码)
db.path(用户名, 密码)
备份和还原
备份
导出数据库: mongodump -h -prot -u -p -d -o
说明:
-h host,服务器IP地址(一般不写,默认本机)
-port 端口(一般不写,默认27017)
-u user,账号
-p password,密码
-d database,数据库(数据库不写导出全局)
-o open,备份到指定目录下