MongoDB基本操作(二)——排序、分页、聚合查询、优化索引等

排序&分页

排序

语法:db.集合名.find().sort(JSON数据)
说明:键-就是要排序的列/字段,值:1升序 -1降序
使用:对年龄进行降序排序
db.c2.find().sort({age:-1})

分页

语法:db.集合名.find().skip(数字).limit(数字)
说明:skip里的数字指跳过指定数量(可选),limit限制查询的数量
db.c2.find().sort({age:-1}).skip(1).limit(2)

聚合查询

语法

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

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

常用表达式:
$sum 总和 $sum:1同count表示统计
$avg 平均
$min 最小值
$max 最大值

准备:
db.c3.insert({
    
    _id:1,name:"a",sex:1,age:1})
db.c3.insert({
    
    _id:2,name:"a",sex:1,age:2})
db.c3.insert({
    
    _id:3,name:"b",sex:1,age:3})
db.c3.insert({
    
    _id:4,name:"c",sex:2,age:4})
db.c3.insert({
    
    _id:5,name:"d",sex:2,age:5})

操作:
男女生的总年龄
#_id 必须加,后跟指定列
#rew 求和 返回结果数
db.c3.aggregate([
	{
    
    
		$group:{
    
    	
			_id:"$sex", 			
			res:{
    
    $sum:"$sex"}   
	}
	}
])

求男女总人数
db.c3.aggregate([
	{
    
    
		$group:{
    
    	
			_id:"$sex", 			
			res:{
    
    $sum:1}   
	}
	}
])

求学生总数和平均年龄
db.c3.aggregate([
	{
    
    
		$group:{
    
    	
			_id:null, 			
			res:{
    
    $sum:1},
      total_avg:{
    
    $avg:"$age"}
	}
	}
])

查询男生女生人数,升序排序
db.c3.aggregate([
	{
    
    $group:{
    
    	_id:"$sex",res:{
    
    $sum:1}}},
	{
    
    $sort:{
    
    res:1}}
])

优化索引

基本操作

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

参数:

  • 待创建索引的列:{键:1,…,键:-1}
    说明:1升序 -1降序 列入{age:1}表示创建age索引并按照升序的方式存储
    额外选项:设置索引的名称或者唯一索引等等
#创建只对单个列为条件的索引
db.c1.create({
    
    name:1})
#创建一个自己取名的索引
db.c1.create({
    
    name:1},{
    
    name:"xzy"})
#创建条件为多个列的组合索引
db.c1.create({
    
    name:1,age:-1},{
    
    "hh"})

#创建唯一索引
db.c1.createIndex({
    
    name:1},{
    
    unique:"name"})

删除索引语法:

  • 全部删除:db.集合名.dropIndexes()
  • 删除指定:db.集合名.dropIndex(索引名)

查看索引语法:db.集合名.getIndexes()

分析索引

语法:db.集合名.find().explain(‘executionStats’)

说明:

COLLSCAN 全表扫描

IXSCAN索引扫描

FETCH根据索引去检索指定document

权限机制

**开启验证模式概念:**指用户需要输入账号密码才能登陆使用

操作步骤:

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

步骤一:添加超级管理员

use admin
db.createUser({
    
    
              "user":"admin",
              "pwd":"123456",
             	"roles":[{
    
    
                       role:"root",
                       db:"admin"
                       }]
              })
              
查看管理员
use admin
show collections
db.system.users.find().pretty()

步骤二:退出卸载服务

//关闭方法db.shutdownServer()  
之后exit

步骤三:安装需要验证的MongoDB服务

#使用--auth参数来开启认证服务
mongod --dbpath /usr/local/var/mongodb --logpath /usr/local/var/log/mongodb/mongo.log --auth --fork

#或在config文件中添加上
security:
	#开启授权认证后再用配置文件来启动即可
	authorization:enabled

需要账号密码的登陆方式:
方法一:
mongo 服务器IP地址:mongo 127.0.0.1/admin -u admin -p 123456
方法二:
mongo进入shell
use admin
db.auth('admin','123456') 返回1则验证成功

例子:

for(var i = 1;i<=10;i++){
    
    
db.goods.insert({
    
    "name":"goodsName"+i,"price":i})
}
添加用户shop1可以读shop数据库
db.createUser({
    
    
              "user":"shop1",
              "pwd":"123456",
             	"roles":[{
    
    
                       role:"read",
                       db:"shop"
                       }]
              })
添加用户shop2可以读写shop数据库
db.createUser({
    
    
              "user":"shop2",
              "pwd":"123456",
             	"roles":[{
    
    
                       role:"readWrite",
                       db:"shop"
                       }]
              })

备份还原

语法:

在终端中执行,该命令不是mongo命令
导出:mongodump -h -port -u -p -d -o
导出语法说明
-h host 服务器IP地址(一般不写 默认本机)
-port port 端口(不写默认27017-u user 用户
-p pwd 密码
-d database 数据库(不写默认导出全部)
-o open 备份到指定目录下

mongodump -u admin -p 123456 -o /Users/didi/xzy文件/mongo
#注意 最新的mongodb版本4.4中,是没有mongodump工具的,需要通过使用brew命令单独下载
#brew install mongodb-database-tools

单独备份一个指定数据库:
mongodump -u shop2 -p 123456 -d shop -o /Users/didi/xzy文件/mongo
#此时好像不能使用admin作为用户来备份,可能是因为这个不是创建在shop中的用户?

Mongoose

官方:http://mongoosejs.com

中文:http://mongosejs.net/

是node中提供操作MongoDB的模块

能过通过Node语法实现MongoDB数据库CURD

从而实现使用node写程序

下载:

npm i mongoose
或者
yarn add mongoose

猜你喜欢

转载自blog.csdn.net/qq_52006948/article/details/120711747