MongoDB自学基础
一、简介
1.简单介绍
- MongoDB是一个基于
分布式文件存储
的数据库 - 由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。
- MongoDB是一个介于
关系数据库
和非关系数据库
之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。 - 它支持的数据结构非常松散,是类似
json
的bson
格式,因此可以存储比较复杂的数据类型。 - Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据
建立索引
2.业务应用场景
传统的关系型数据库(如MySQL),在数据操作的三高
需求以及应对Web2.0的网站需求面前,显得力不从心,而 MongoDB
可应对“三高“需求
-
High performance
:对数据库高并发读写的需求 -
Huge Storage
:对海量数据的高效率存储和访问的需求 -
High Scalability && High Availability
:对数据库的高可扩展性和高可用性的需求
- 增加了 多屏幕编辑 Markdown文章功能;
- 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
- 增加了 检查列表 功能。
二、基本常用命令
1.数据库相关
#查看所有数据库
show databases
#选择数据库(如果数据库不存在,不会报错,会隐式创建;当后期该数据库有数据时自动创建)
use 数据库名
#删除数据库(先选中数据库)
db.dropDatabase()
2.集合相关
# 查看所有集合
show collections
# 创建集合(插入数据会隐式创建)
db.createCollections('集合名')
# 删除集合
db.集合名.drop()
三、CURD
增:插入文档
db.集合名.insert(json数据)
- 集合存在则直接插入数据,不存在则隐式创建集合并插入数据
- json数据格式要求key需要加"“,但是这里为了方便查看,对象的key统一不加”“,查看集合数据时系统会自动给key加”"
- mongodb会自动给每条数据创建全球唯一的_id键(我们也可以自定义_id的值,只要给插入的json数据增加_id键即可覆盖,但是不推荐这么做)
测试
插入一条数据
一次插入多条数据并指定_id
利用for循环插入数据
for(var i = 1;i<10;i++){
db.student.insert({name:"a"+i,age:i})
}
删:删除文档
db.集合名.remove(条件 [,是否删除一条])
# 是否删除一条
- false删除多条,即全部删除(默认)
- true删除一条
删除一条数据
全部删除
改:修改文档
db.集合名.update(条件,新数据 [,是否新增,是否修改多条])
# 新数据
- 默认是对原数据进行替换
- 若要进行修改,格式为 {修改器:{key:value}}
# 是否新增
- 条件匹配不到数据时是否插入: true插入,flase不插入(默认)
# 是否修改多条
- 条件匹配成功的数据是否都修改: true都修改,flase只修改一条(默认)
修改器 | 作用 |
---|---|
$inc | 递增 |
$rename | 重命名列 |
$set | 修改列值 |
$unset | 删除列 |
准备工作: 插入十条数据
for(var i = 1;i<= 10;i++){
db.people.insert({name:"xyh"+i,age:i})
}
将{name:“xyh1”}更改为{name:“xyh2”}
db.people.update({name:"xyh1"},{name:"xyh2"})
发现问题:默认不是修改而是替换
使用正确修改格式进行修改:
db.people.update({name:"xyh3"},{$set:{name:"xyh33333"}})
增减年龄或者是减少年龄
#增加两岁
db.people.update({name:"xyh10"},{$inc:{age:5}})
#减少两岁
db.people.update({name:"xyh10"},{$inc:{age:-5}})
一次写多个修改器
首先插入一条数据:
db.people.insert({username:"rb",age:20,sex:"男",address:"jinan"})
修改rb的username为jerry,age+11,sex字段重命名为性别,删除address
db.people.update({username:"rb"},{
$set:{username:"jerry"},
$inc:{age:11},
$rename:{sex:"性别"},
$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 |
只查询一列: name列
查询除name列外的所有列
查询指定条件的数据
四、排序和分页
数据准备:
for(var i = 1;I<5;i++){
db.person.insert({_id:i,name:"p"+i,age:10+i})
}
排序
db.集合名.find().sort(json数据)
# json数据(key:value)
- key就是要排序的字段
- value为1表示升序,-1表示降序
按年龄降序排序
分页
db.集合名.find().sort().skip(数字).limit(数字)[.count()]
#skip(数字)
- 指定跳过的数量(可选)
#limit(数字)
- 限制查询的数量
# count()
- 统计数量
测试:
五、聚合查询
1.语法
db.集合名.aggregate({
{管道:{表达式}}
...
})
常用管道:
$group | 将集合中的文档分组,用于统计结果 |
---|---|
$match | 过滤数据,只输出符合条件的文档 |
$sort | 聚合数据进一步排序 |
$skip | 跳过指定文档数 |
$limit | 限制集合数据返回文档数 |
常用表达式:
$sum | 总和($num:1同count表示统计) |
---|---|
$avg | 平均 |
$min | 最小值 |
$max | 最大值 |
2.测试
数据准备:
db.people.insert({_id:1,name:"a",sex:"男",age:21})
db.people.insert({_id:2,name:"b",sex:"男",age:20})
db.people.insert({_id:3,name:"c",sex:"女",age:20})
db.people.insert({_id:4,name:"d",sex:"女",age:18})
db.people.insert({_id:5,name:"e",sex:"男",age:19})
统计男生、女生总年龄
统计男生女生的总人数
db.people.aggregate([
{$group:{_id:"$sex",sum:{$sum:1}}}
])
求学生总数和平均年龄
db.people.aggregate([
{$group:{_id:null,total_num:{$num:1},total_avg:{$avg:"$age"}}}
])
查询男生、女生人数、按人数降序
db.people.aggregate([
{$group:{_id:"$sex",rs:{$sum:1}}},
{$sort:{rs:1}}
])
参考作者:
参考原作者链接