MongoDB自学基础(一)

一、简介

1.简单介绍

  • MongoDB是一个基于分布式文件存储的数据库
  • 由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。
  • MongoDB是一个介于关系数据库非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
  • 它支持的数据结构非常松散,是类似jsonbson格式,因此可以存储比较复杂的数据类型。
  • Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引

2.业务应用场景

传统的关系型数据库(如MySQL),在数据操作的三高需求以及应对Web2.0的网站需求面前,显得力不从心,而 MongoDB可应对“三高“需求

  • High performance:对数据库高并发读写的需求

  • Huge Storage:对海量数据的高效率存储和访问的需求

  • High Scalability && High Availability:对数据库的高可扩展性和高可用性的需求

  1. 增加了 多屏幕编辑 Markdown文章功能;
  2. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  3. 增加了 检查列表 功能。

二、基本常用命令

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不等于
$inin
$ninnot 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}}
])

在这里插入图片描述
参考作者:
参考原作者链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值