MongoDB-------基础语法

MongoDB数据库

安装

创建服务:

bin/mongod.exe --install --dbpath 磁盘 路径 --logpath 日志路径

注意: 通过管理员身份运行DOS窗口 否则没有权限创建失败

删除服务

bin/mongod.exe --remove

启动服务:

net start mongodb

登录(验证是否安装成功)

bin/mongo

关闭服务:

net stop mongodb

基本操作

查看数据库

语法: show databases
在这里插入图片描述

选择数据库

语法: use 数据库名称

在这里插入图片描述

查看集合

语法: show collections

创建集合

语法: db.collection

效果:
在这里插入图片描述

删除集合

语法: db.集合名.drop()
在这里插入图片描述

如何删除数据库?

1,通过 use 语法选择数据库, 2,通过 db.dropDatabase() 删除数据库

小总结

数据库(查看,创建,选择,删除

查看: show databases
创建: 有单独的语法, 但是经常通过隐式创建
选择: use 数据库名
删除: 1.通过 use 语法选中数据库,2, 通过 db.dropDatabase() 删除数据库

集合

查看: show collections
创建: db.createCollection('集合名')
删除: db.集合名.drop()

文档增删改查

语法: db.集合名.insert(JSON数据)

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

练习: 在 test2 数据库的c1集合中插入数据(姓名 webopenfather年龄18岁)

use test2
db.c1.insert({uname: "webopenfather", age:18})

注意:  数据库和集合不存在 都为隐式创建
      对象的键统一不加引号方便看, 但是查看集合数据时系统会自动增加

在这里插入图片描述

在这里插入图片描述

是否可以自定义_id值?

只需给插入的JSON数据增加_id键即可覆盖(但是不推荐)

db.c1.insert({id_:1, uname: "webopenfather", age: 18})

在这里插入图片描述

如何插入多条记录

传递数组,数组中写入一个个 JSON数据即可

db.c1.insert([
	{uname: "z2", age:3},
	{uname: "z3", age:4},
	{uname: "z4", age:5}
])

如何快速插入10条数据

mongodb底层使用JS引擎实现的, 所以支持部分js语法

因此: 可以写 for 循环

在 test2数据库c2集合插入10条数据,分别为 a1, a2, a3,,,a10
use test2
for(let i = 0; i <= 10; i++) {
	db.c2.insert({uname: "a"+i, age:i})
}

在这里插入图片描述

基础语法: db.集合名.find(条件[, 查询的列])

条件
	查询所有的数据       {}或者不写
	查询age=6的数据      {age:6}
	既要age=6又要性别=男   {age:6, sex: '男'}
	
查询的列 (可选参数)
	不写  -  查询全部列(字段)
	{age:1}   只显示age列
	{age:0}   除了age列(字段都显示)
不论你怎么写,系统自定义的_id都会显示	

升级语法:

db.集合名.find({
	键: {运算符:值}
})
运算符 作用
$gt 大于
$gte 大于等于
$lt 小于
$lte 小于等于
$ne 不等于
$in in
$nin not in

在这里插入图片描述
查询age=5,8,10的数据
在这里插入图片描述

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

是否新增: 指条件匹配不到数据则插入(true是插入, false是不插入默认)
是否修改多条: 指将匹配成功的数据修改(true是, false否)

升级语法

db.集合名.update (条件, 新数据)
					  {修改器: {键:值}}
修改器 作用
$inc 递增
$rename 重命名列
$set 修改列值
$unset 删除列

案例:

将{uname:“xy1”}改为{uname: “xy2”}

在这里插入图片描述

使用基础语法修改数据,新数据会把旧数据替换

将 {uname:“xy3”}改为 {uname: “xy33”}

db.c3.update({uname: "xy3"},{$set: {uname: "xy33"}})
在这里插入图片描述

将 {uname: “xy10”}的age增加两岁,

db.c3.update({uname:"xy10"}, {$inc: {age: 2}})
在这里插入图片描述

如何一次性写入多个修改器?(用逗号隔开)

db.c3.update({uname: "小雨"}, {
​	$rename: {who: "identify"},
​	$unset: {other: true}
})

在这里插入图片描述

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

是否删除一条: 默认为false (删除匹配到的所有数据)

排序

语法: db.集合名.find().sort(JSON数据)

说明: 键 就是要排序的列/字段, 值: 1升序 -1降序

练习: 年龄升序&降序

db.c1.find().sort({age: -1}) 降序

db.c1.find().sort({age: 1})升序

limit与skip方法

语法: db.集合名.find().sort().skip(数字).limit(数字)

说明: skip跳过指定数量 (可选), limit限制查询的数量

练习: 1,降序查询查询2条 2, 降序跳过两条并查询两条
在这里插入图片描述

分页

需求: 数据库 1-10条数据, 每页显示两条

语法: db.集合名.find().skip().limit(2)

skip计算公式: (当前页 - 1) * 每页显示条数

.count() 统计总数量

聚合查询

如何统计数据,如何实现分组统计

语法

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

常用管道

$group  将集合中的文档分组, 用于统计结果
$match  过滤数据, 只需输出符合条件的文档
$sort   聚合数据进一步排序
$skip   跳过指定文档数
$limit  限制集合数据返回文档数
...

常用表达式

$sum  总和  $sum:1同count表示统计
$avg  平均  
$min  最小值
$max  最大值
...
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}
	}
])

在这里插入图片描述

索引

语法:

创建索引语法:

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

参数:

待创建的列: {键:1,…,键:-1}
说明: 1升序,-1降序 例{age:1}表示创建age索引并按照升序的方式储存
额外选项: 设置索引的名称或者唯一索引等等

删除索引语法:

全部删除: db.集合名.dropIndexes()

删除指定: db.集合名.droupIndex(索引名)

查看索引语法:

db.集合名.getIndexes()

给name添加普通索引, db.c1.createIndex({name:1})
在这里插入图片描述

给name添加索引,名字为web, db.c1.createIndex({name:1},{name:web})

创建复合/组合索引

一次性给两个字段添加索引

db.集合名.createIndex({键1:方式,键2:方式})
在这里插入图片描述
创建唯一索引

db.集合名.createIndex(带添加索引的列, {unique: true})

分析索引

  • db.集合名.find().explain(‘executionStats’)
  • 说明
实例:
{
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "test.tb3",
        "indexFilterSet" : false,
        "parsedQuery" : {
            
        },
        "winningPlan" : {
            "stage" : "COLLSCAN",
            "direction" : "forward"
        },
        "rejectedPlans" : [ ]
    },
    "executionStats" : { // 执行计划相关统计信息
        "executionSuccess" : true, // 执行成功的状态
        "nReturned" : 3, // 返回结果集数量
        "executionTimeMillis" : 0, // 执行所需的时间,毫秒
        "totalKeysExamined" : 0, // 索引检查的时间
        "totalDocsExamined" : 3, // 查询文档总数
        "executionStages" : {
            "stage" : "COLLSCAN", // 索引扫描方式(COLLSCAN 全表扫描;IXSCAN 索引扫描; FETCH 根据索引去检索指定document)
            "nReturned" : 3, // 返回结果集数量
            "executionTimeMillisEstimate" : 0, // 预估的执行时间,毫秒
            "works" : 5, // 工作单元数,一个查询会被派生为一些小的工作单元
            "advanced" : 3, // 优先返回的结果数量
            "needTime" : 1,
            "needYield" : 0,
            "saveState" : 0,
            "restoreState" : 0,
            "isEOF" : 1,
            "direction" : "forward", // 方向
            "docsExamined" : 3 // 文档检查数量
        }
    },
    "serverInfo" : {
        "host" : "e8797fbe90f9",
        "port" : 27017,
        "version" : "4.4.2",
        "gitVersion" : "15e73dc5738d2278b688f8929aee605fe4279b0e"
    },
    "ok" : 1
}


索引扫描方式:

COLLSCAN 全表扫描

IXSCAN 索引扫描

FETCH 根据索引去检索指定document

选择规则(如何选择合适的列创建索引)

  • 为常做条件,排序,分组的字段建立索引
  • 选择唯一性索引
  • 选择较小的数据列, 为较长的字符串使用前缀索引

MongoDB权限机制

开启验证模式

// mongodb数据库角色
1、数据库用户角色: read、readWrite
2、数据库管理角色:dbAdmin、dbOwner、userAdmin
3、集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager
4、备份恢复角色:backup、restore
5、所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
6、超级用户角色:root
7、内部角色:__system
8、内建的角色

角色说明:
read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限
概念:

用户需要输入账号密码才能登录使用

操作步骤:

  1. 添加超级管理员
  2. 退出卸载服务
  3. 重新安装需要输入账号密码的服务 (注: 在原安装命令基础上加上–auth即可)
  4. 启动服务 -> 登录测试

添加超级管理员

mongo

use admin
db.createUser({
	"user": "admin",
	"pwd": "admin888",
	"roles": [{
		role: "root",//root 代表超級管理员权限 
		db: "admin" //admin代表给admin数据库加的超级管理员
	}]
})

db.system.users.find().pretty() 格式化查看

退出卸载服务

mongod --remove

注意:

  • 以管理员的身份卸载
  • 切换到 bin 目录下

安装需要身份验证的MongoDB服务

bin\mongod --install --dbpath E:\mongdb\data --logpath E:\mongodb\logs\mongodb2.log --auth

启动服务

法一:

mongo localhost:27017/admin -u admin -p admin888

mongo 127.0.0.1:27017/admin -u admin -p admin888

法二: 先登录,选择数据库,输入db.auth(用户名,密码)

在这里插入图片描述

练习:

  • 需求

添加用户shop1可以读shop数据库

添加用户shop2可以读写shop数据库

注意: 必须在对应数据库创建用户

use shop

## shop1
db.createUser({
	"user": "shop1",
	"pwd": "admin888",
	"roles": [{
		role: "read",
		db: "shop"
	}]
})

## shop2
db.createUser({
	"user": "shop2",
	"pwd": "admin888",
	"roles": [{
		role: "readWrite",
		db: "shop"
	}]
})

在这里插入图片描述
在这里插入图片描述

备份数据库mongoudmp

  • 语法
导出数据语法: mongodump -h -port -u -p -d -o

导出语法说明:
	-h      host     服务器IP地址  (一般不写 默认本机)
	-port            端口(一般不写 默认27017)
    -u      user     账号
    -p      pwd      密码
    -d      database 数据库(留心: 数据库不写则导出全局)
    -o      open     备份到指定目录
  • 练习(备份所有数据)

mongodump -u admin -p admin888 -o E:\mongodb\bak

  • 练习:(备份指定数据)

mongodump -u shop1 -p admin888 -d shop -o E:\mongodb\bak2

还原数据库mongorestore

  • 语法

还原数据语法: mongorestore -h port -u -p -d–drop 备份数据目录

还原语法说明:
-h host 服务器IP地址 (一般不写 默认本机)
-port 端口(一般不写 默认27017)
-u user 账号
-p pwd 密码
-d database 数据库(留心: 数据库不写则还原全部)
–drop 先删除数据库在导入

  • 练习

还原所有数据库

mongorestore -u admin -p admin888 --drop E:\mongodb\bak

还原指定数据库

mongorestore -u shop2 -p admin888 -d shop --drop E:\mongodb\bak2\shop

实战可视化管理工具

使用robot3T

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_63300737/article/details/124224567
今日推荐