MongoDB——基础语法

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: MongoDB——基础语法

MongoDB数据库

安装

创建服务:

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

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

删除服务

bin/mongod.exe --remove

启动服务:

net start mongodb

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

关闭服务:

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


相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
6月前
|
存储 NoSQL MongoDB
深入解析 MongoDB 与 Python:基本语法、实用示例与最佳实践
深入解析 MongoDB 与 Python:基本语法、实用示例与最佳实践
109 0
|
NoSQL JavaScript MongoDB
mongodb语法
mongodb语法
|
SQL NoSQL MongoDB
MongoDB数据库【基本语法内容】2
6.更新文档 update() 方法用于更新已存在的文档。语法格式如下:
217 2
MongoDB数据库【基本语法内容】2
|
存储 JSON NoSQL
MongoDB数据库【基本语法内容】
如果数据库不存在,则创建数据库,否则切换到指定数据库 三部曲,创建数据库,查看当前使用的数据库,查看所有的数据库
167 1
MongoDB数据库【基本语法内容】
|
SQL NoSQL 关系型数据库
MongoDB数据库【高级语法篇】
1.Limit与Skip方法 Limit() 方法 如果你需要在MongoDB中读取指定数量的数据记录,可以使用MongoDB的Limit方法,limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数。 以下实例为显示查询文档中的两条记录:
240 0
MongoDB数据库【高级语法篇】
|
NoSQL MongoDB 数据库
MongoDB服务开启及简单语法(新手教程)
刚开始学习mongodb教你如何打开服务和一些简单语法
577 0
|
数据可视化 关系型数据库 MySQL
node-mongoDB-01-基础语法
flag不能随便立呀 今天搞定这几篇文章
122 0
|
SQL NoSQL MongoDB
MongoDB查询简单语法
1.  基本查询:    构造查询数据。    > db.test.findOne()    {         "_id" : ObjectId("4fd58ecbb9ac507e96276f1a"),         "name" : "stephen",         "age" : 35,         "genda" : "male",         "email" : "stephen@hotmail.com"    }     --多条件查询。
1361 0
|
JSON NoSQL 数据库
mongodb 的基本函数语法封装
//这个模块里面封装了所有对数据库的常用操作 var MongoClient = require('mongodb').MongoClient; var config = require("../config.
1417 0
下一篇
DataWorks