1.5第三阶段2 MongoDB 数据库

Posted 编程界小学生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1.5第三阶段2 MongoDB 数据库相关的知识,希望对你有一定的参考价值。

MongoDB数据库

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

MongoDB的数据层次: 文档 -> 集合 -> 数据库

文档: 类似于表中的一条记录,格式 : “属性名”:“属性值”, …

集合: 由多个文档组成的,类似于表

数据库: 由多个集合组成中,类似于mysql的数据库。

一、安装mongo服务

下载地址:https://www.mongodb.com/try/download/community?tck=docs_server

环境变量设置:

将 MongoDB安装的bin完整路径添加到环境变量的用户变量中的Path中。

Win+R 输入 cmd打开新的命令窗口,输入mongo, 进入到mongo交互环境中。

二、CURD操作

官方文档:https://www.mongodb.com/docs/mongodb-shell/run-commands/

【扩展】docker部署安装mongo

su root
docker version
docker pull mongo
docker run -itd --name mg1 -p 27017:27017 mongo
docker exec -it mg1 mongo

1 数据库操作

help 查询命令说明
show dbs  查看所有的数据库
use <数据库名>  打开或创建数据库, 如打开或创建stu数据库: use stu
db.dropDatabase() 删除当前的数据库

2 集合操作

db.help()  查看当前数据库下相关的操作函数命令
show collections 查看当前库下的所有集合
db.createCollection(name) 创建集合

如1: 创建student集合

use stu
db.createCollection('student')
db.集合名.help() 查看当前集合下的函数命令
db.集合名.drop()  删除`集合名`的集合

如2: 删除student集合

db.student.drop()

3 插入文档

文档是属于某一个集合中的一条数据, 文档操作属于集合下的命令,所以操作文档的函数以db.集合名.开头的。

json数据: javascript object 简化的数据对象,只有属性和属性值。

json数据分两种结构类型: json对象 , json数组 [ ]

json对象:

"name": "张三", "sex": "男", "age": 20

json数组:

[
   ,
   ,
   "lovies":  ["打球", "看书"] 
]
db.createCollection('student')
db.student.insert(obj)  插入文档数据,文档数据以json对象格式呈现的
db.student.insertMany([objs])
db.student.save(obj) 保存或更新数据

如1: 向student集合插入一条数据

db.student.insert(_id: 1, name: "disen", age: 20)

如2: 向student集合中批量插入三条数据

db.student.insertMany([_id: 2, name: "刘平", age:21, _id:3, name:"刘丹",age:19, name: "王海", age: 19])

【注意】文档中主键的属性默认为_id,如果没有提供此属性值则会自动生成一个。

> db.student.find()
 "_id" : 1, "name" : "disen", "age" : 20 
 "_id" : 2, "name" : "刘平", "age" : 21 
 "_id" : 3, "name" : "刘丹", "age" : 19 
 "_id" : ObjectId("6242cc9a41ff9536491c5469"), "name" : "王海", "age" : 19 

如3: 更新_id为1的name为disen666

db.student.save(_id:1, name:"disen666")

【注意】save()将_id存在的数据使用新的数据进行替换。

4 查询文档

db.集合名.find([查询条件], [查看属性]).pretty()

pretty()方法以格式化的方式来显示文档

4.1:查看所有学生的姓名

db.student.find(, name:1)
 "_id" : 1, "name" : "disen666" 
 "_id" : 2, "name" : "刘平" 
 "_id" : 3, "name" : "刘丹" 
 "_id" : ObjectId("6242cc9a41ff9536491c5469"), "name" : "王海" 

4.2:查询年龄大于等于20的所有学生

db.student.find(age:$gte: 20)

【说明】$开头的标识符表示某一个条件名称变量

$or 多个条件之间的 或 的关系
$gt  大于
$lt  小于
$gte 大于等于
$lte 小于等于
$ne  不等于
$in  范围找到,每个属性值之间的关系是or
$regex 使用正则表达式查找, 正则表达式是一种语言,主要用于内容匹配。
	   \\w 表示字母和数字
	   \\d 表示数字
	   .  任意字符
	   *  0或多个
	   +  1或多个
	   ?  0或1个
	   n 长度n个
	   n, 长度至少n个
	   n, m 长度在n和m之间
	   ^  内容的开始
	   $  内容的结束

4.3: 查看年龄在19到20之间的所有学生

db.student.find(age: $gte:19, $lte: 20)

统计个数:

db.student.find(age: $gte:19, $lte: 20).count()

4.4: 查看姓名中包含n字母的所有学生

db.student.find(name: $regex: "n")

4.5: 查看姓的所有学生

db.student.insert(_id:6, name: "小刘", age: 18)
db.student.find(name: $regex: "^刘")
db.student.find(name: $regex: "丹$")

4.6:Limit() 方法

limit()方法基本语法如下所示:

>db.COLLECTION_NAME.find().limit(NUMBER)
--查看前几条数据

显示查询文档中的两条记录:

> db.col.find(,"title":1,_id:0).limit(2)
 "title" : "php 教程" 
 "title" : "Java 教程" 
>

注:如果你们没有指定limit()方法中的参数则显示集合中的所有数据。

4.7:Skip() 方法

使用skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。

skip() 方法脚本语法格式如下:

>db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

实例

以下实例只会显示第二条文档数据

>db.col.find(,"title":1,_id:0).limit(1).skip(1)
 "title" : "Java 教程" 
>

**注:**skip()方法默认参数为 0 。

4.8:sort() 方法

sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。

sort()方法基本语法如下所示:

>db.COLLECTION_NAME.find().sort(KEY:1)

以下实例演示了 col 集合中的数据按字段 likes 的降序排列:

>db.col.find(,"title":1,_id:0).sort("likes":-1)
 "title" : "PHP 教程" 
 "title" : "Java 教程" 
 "title" : "MongoDB 教程" 
>

4.9:索引

4.9.1:createIndex() 方法来创建索引。

createIndex()方法基本语法格式如下所示:

>db.collection.createIndex(keys, options)

语法中 Key 值为你要创建的索引字段,1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可。

createIndex() 方法中你也可以设置使用多个字段创建索引(关系型数据库中称作复合索引)。

>db.col.createIndex("title":1,"description":-1)
>
4.9.2:查看所有索引
db.persons.getIndexes()
4.9.3:删除索引
db.集合名.dropIndex(索引名)

4.10:聚合aggregate()

aggregate() 方法的基本语法格式如下所示:

>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

实例

> db.mycol.aggregate([$group : _id : "$by_user", num_tutorial : $sum : 1])

   "result" : [
      
         "_id" : "qf.com",
         "num_tutorial" : 2
      ,
      
         "_id" : "Neo4j",
         "num_tutorial" : 1
      
   ],
   "ok" : 1

>

以上实例类似sql语句:

 select by_user, count(*) from mycol group by by_user

5 更新文档

db.集合名.update(条件, $set: 属性:值,..., is_upsert, multi)

如1:更新姓的学生性别为

db.student.update(name: $regex: "^刘",  $set: sex: "女", false, true)

【说明】is_upsert为false时,表示如果更新的数据不存在时,不做处理,反之插入数据;multi为true表示更改所有匹配的文档(数据)

如2: 更新所有学生的性别 为男

db.student.update(, $set: sex: "男",false, true)

6 删除文档

db.集合名.remove(条件)

如:删除_id为1的文档数据

db.student.remove(_id:1)
db.student.remove(_id: ObjectId("6242cc9a41ff9536491c5469"))

MongoDB数据库系列MongoDB基础

第一章、MongoDB基础

学习目标

  • 数据库种类
  • MongoDB简介
  • MongoDB安装
  • MongoDB基本操作
  • MongoDB文档增删修查(CURD)
  • MongoDB实战教学管理系统数据库设计

数据库种类

  • 关系型:Oracle、MySQL、SQLite 、SQL Server等
  • 非关系型(Not Only SQL):MongoDB(文档)、Redis/Memcache(内存)

关系型和非关系型数据库软件区别

  • 相同点:都是数据库软件,用来存放项目数据
  • 不同点:
    关系型:1.遵循SQL标准,换句话说语法大同小异、2.有库和表约束等
    非关系型:1.没有统一标准、2.一般键值对形式存储、3.读取速度更快

关系型和非关系型数据库如何选择:

在这里插入图片描述

1、MongoDB简介

  • MongoDB是一个基于分布式文件存储的数据库,由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。
  • MongoDB是一个介于关系型和非关系型数据库之间的产品,是非关系型数据库当中功能最为丰富,也是最像关系型数据库的。
  • 支持的数据结构非常松散,是类似json的bson格式

    JSON(Javascript Object Notation JS对象简谱)是一种轻量级的数据交换格式bson(二进制JSON)

下载版本地址

  • windows版本下载:https://www.mongodb.org/dl/win32
  • linux版本下载:https://www.mongodb.org/dl/linux
  • 社区免费版(自选版本):https://www.mongodb.com/try/download/community
  • 版本说明:

    2.x
    3.x (3.2 、3.4、3.6 )
    4.x (4.2 更佳的数据管理能力、更强的分布式架构、多文档事物等)
    在这里插入图片描述

2、Windows下安装MongoDB

2.1、步骤

  • 步骤1:下载地址:https://www.mongodb.com/try/download/community

  • 步骤2:解压

    解压后先在解压目录中创建如下文件夹,用于创建MongoDB服务
    在这里插入图片描述

  • 步骤3:创建MongoDB服务

    注意:
    1:必须要通过管理员身份运行DOS窗口,切换到bin目录下,否则无权限会创建失败
    2:得提前创建数据和日志存放目录 (上述我们已创建)
    在这里插入图片描述

  • 执行如下命令:

    #此处的磁盘路径就是我们上述的data文件夹路径
    #此处的日志路径就是我们上述的log文件夹路径
    mongod.exe --install --dbpath 磁盘路径 --logpath 日志路径
    

    在这里插入图片描述
    执行上述命令直接回车即可:
    在这里插入图片描述
    去服务中查看MongoDB服务是否创建成功?
    在这里插入图片描述

  • 步骤4:启动服务

    net start mongodb
    

    在这里插入图片描述

  • 步骤5:登录(验证是否安装成功)

    #连接MongoDB数据库
    mongo
    

    在这里插入图片描述

  • 关闭服务命令:

    net stop mongodb
    

2.2、Linux系统下安装MongoDB

  • 步骤1:下载curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6.tgz
  • 步骤2:解压
    tar -zxvf mongodb-linux-x86_64-3.0.6.tgz
  • 步骤3:将解压包拷贝到指定目录
    mv mongodb-linux-x86_64-3.0.6/ /usr/local/mongodb
  • 步骤4:创建数据存放目录与日志存放目录
    mkdir -p /usr/local/mongodb/data /usr/local/mongodb/logs
  • 步骤5:启动MongoDB服务
    /usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data --logpath=/usr/local/mongodb/logs/mongodb.log --logappend --port=27017 --fork
  • 后期登录即可
    /usr/local/mongodb/bin/mongo

3、启动成功后,为数据库设置登录密码(数据安全)

3.1、查看所有数据库

#查看所有数据库
show databases
show dbs #缩写指令

在这里插入图片描述

3.2、选择admin数据库,并为其设置用户和密码

3.2.1、给admin数据库设置用户和密码及权限角色

db.createUser({user: 'root', pwd: '123456', roles: ['root']})

3.2.2、验证是否设置成功

#这里用db.auth('root', '123456') 
#如果返回 '1'表示验证成功, 如果是 '0' 表示验证失败.
db.auth('用户名''用户密码') 

在这里插入图片描述

4、基本指令操作

  • 查看数据库
    show databases #完整形式
    show dbs #缩写形式
    
  • 选择数据库
    use admin
    
  • 查看集合
    show collections
    
    在这里插入图片描述
  • 创建集合
    db.createCollection('集合名')
    
  • 删除集合
    db.集合名.drop()
    
    在这里插入图片描述
  • 删除数据库
    #第一步
    use 数据库名
    #第二步
    db.dropDatabase()
    
    在这里插入图片描述

5、MongoDB文档增删改查(CURD)

5.1、增加数据(Create)

  • 向集合中插入数据

    db.集合名.insert({key1:'value1',key2:'value2',……})
    
  • 查看集合中的数据

    db.集合名.find()
    

    留心1:数据库和集合不存在的时候都会隐式创建
    留心2:对象的键统一不加引号方便看,但是查看集合数据时系统会自动加
    留心3:mongodb会给每条数据增加一个全球唯一的_id键,当然也可以自己赋值把系统自定义的覆盖掉(非常不建议这样做

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

  • 一次性向集合中插入多条记录

    #注意此处的中括号
    db.集合名.insert([
    	{uname:'lisi',pwd:'654321',age:22},
    	{uname:'wangwu',pwd:'123321',age:23},
    	{uname:'zhaoliu',pwd:'112233',age:24}
    ])
    

    在这里插入图片描述

  • 如何向集合中快速插入十条数据

    for(var i=0;i<=10;i++){
    	db.集合名.insert(uname:'a'+i,pwd:'pwd'+i,age:i)
    }
    

    在这里插入图片描述

5.2、查找数据(Read)

  • 按条件查询所有数据
    db.集合名.find({},{条件}) #前面的{}也可以不写
    
  • 语法:
    db.集合名.find({ 键:{运算符:值} })
    

    条件:查询所有数据 {}或者不写

    • 查询age=6的数据 ----{age:6}
    • 既要age=6又要性别=男 ----{age:6,sex:‘男’}
    • 查询的列:参数不写 ----是查询全部列
    • 字段 {age:1} 只显示age列(
    • 字段 {age:0} 除了age列其他字段都显示
    • 留心:不管你怎么写系统自定义的_id都会在
  • 运算符:
    $gt 大于
    $gte 大于等于
    $lt 小于
    $lte 小于等于
    $ne 不等于
    $in 在其中
    $nin 不在其中
    
    在这里插入图片描述
  • 查询年龄大于5的记录
    在这里插入图片描述
  • 查询年龄为5,岁、8岁、10岁的记录
    在这里插入图片描述

5.3、修改数据(Update)

  • 将{uname:‘zs1’}修改为{uname:‘zs11’}
    db.集合名.update({uname:'zs1'},{{uname:'zs11'})
    
    在这里插入图片描述
  • 使用升级语法修改器(将zs4的姓名改为zs44)
    db.c3.update({uname:"zs4"}, {$set: {uname: "zs44"}})
    
  • 修改器语法:
    $set #修改列值
    $unset #删除列值
    $inc #递增
    $rename #修改列名(重命名)
    
    在这里插入图片描述
  • 给{uname:“zs10”}的年龄加2岁或者减2岁(利用$inc)
    在这里插入图片描述
  • 综合利用修改器
    在这里插入图片描述

5.4、删除数据(Delete)

  • 语法:
    db.集合名.remove({},true/false) #后面的条件不写默认是false
    

    注意:是否删除一条记录

    • true-是
    • false-否(默认)
      在这里插入图片描述
  • MongoDB增删改查CURD标识总结:
  • 增Create
    db.集合名.insert()
    
  • 删Delete
    db.集合名.remove()
    
  • 改Update
    db.集合名.update()
    
  • 查Read
    db.集合名.find()
    

以上是关于1.5第三阶段2 MongoDB 数据库的主要内容,如果未能解决你的问题,请参考以下文章

爬虫用到的知识点

MongoDB分页获取数据排序阶段缓存溢出问题

09 mongoDB基础(进阶)

时序数据库时间序列数据和MongoDB第三部分-查询分析和呈现时间序列数据

MongoDB 提升性能的18原则(开发设计阶段)

第二次阶段冲刺第三天(6月2号)