数据库:在计算机中长期帮应用存储数据的。

数据库两大类:
1. 关系型数据库 : Mysql orcale sqlserver …

关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织。

    优点:
        1、易于维护:都是使用表结构,格式一致;
            Mysql orcale sqlserve都是基于SQL语句的,格式是非常像的。

        2、使用方便:SQL语言通用,可用于复杂查询;
        3、复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。
            多表查询,表关联的操作,事务操作,触发器。。。

    缺点:
        1、读写性能比较差,尤其是海量数据的高效率读写;
            操作sql语句,内部非常耗性能。
        2、固定的表结构,灵活度稍欠;
        3、高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。


2. 非关系型数据库:mongodb、redis ...

    非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等。

        { key : value }
        mongodb -> 文档 类似于JSON的数据 ,数据库底层存储的是 二进制JSON(BSON)

    优点:
        1、格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。
            存储类型会更多,布尔值、数组、对象。。

        2、速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;
            水平扩容比较好,并发多了,可以添加数据库服务器做分布式即可。
        3、高扩展性;
        4、成本低:nosql数据库部署简单,基本都是开源软件。
    缺点:
        1、不提供sql支持,学习和使用成本较高;
        2、无事务处理;
        3、数据结构相对复杂,复杂查询方面稍欠。
            关联表的功能,主键和外键,锁的概念。

            公司 -> 小项目 -> 一款数据库
                 -> 大项目 ->  多款数据库混合使用 :缓存数据库、资源数据库、web数据库、存储数据库 ...


node + mysql -> 可以的   php + mysql
node + mongodb -> 更多的选择

//-----------------------------------------------

mongodb的具体操作:

1. 下载软件:https://www.mongodb.com/try/download/community
    3.2.10版本
2. 把bin目录添加到环境变量中,这样可以全局访问。

3. 启动数据库 : 默认端口号:27017  ,修改加 --port
    mongod --dbpath=d:/mdb3 
    
4. 操作数据库:

    1. 命令行如何操作mongodb
        1. mongo 进行 操作环境

        2. 用可视化工具
            Robo 3T 1.3.1

mongodb命令行语法:
show dbs : 查看所有数据库,但是如果这个数据库是空的,是不显示的。
local -> 初始是有值的数据库
test -> 空的数据库

use [dbname] -> 切换数据库
use [dbname] -> 如果dbname不存在,那么就创建一个数据库,并且切换到这个数据上


db.createCollection([collname])  ->  创建一个集合

db.dropDatabase() : 删除当前数据库

可以具体查看mongod相关方法有哪些:
    db.help() : 看数据库的方法
    db.test.help() : 看test数据库的方法
    db.test.find().help() : 看find()方法下的方法	

Collection聚集集合操作:
    db.createCollection('musiclist')   创建一个集合
    db.getCollection('musiclist')   查看musiclist集合
    db.getCollectionNames() :  查看当前数据下的所有集合
	show collections :  可以查看现在有多少个集合
    db.printCollectionStats() : 查看集合的状态
    db.musiclist.drop() :   删除集合

数据库的增删改查:crud操作。

    增:
        db.集合名.insert({});  //单条添加
        db.集合名.insert([{},{},{}]);  //多条添加
        db.集合名.insertMany([{},{},{}]);  //多条添加
        db.集合名.save({});  //单条添加
        db.集合名.save([{},{},{}]);  //多条添加

    删:
        db.集合名.deleteOne({})
            db.musiclist.deleteOne({users:"张杰2"})  删除一条数据
            db.musiclist.deleteMany({users:"张杰2"}) 删除所有数据
        db .集合名.remove({users:"张杰2"})  删除所有数据
            db .集合名.remove({users:"张杰2"},true)  删除一条数据
            db .集合名.remove({})  : 删除所有
        db.集合名.drop()
            删除当前集合
    改: 
        第一个参数:条件 , 第二个参数是修改的字段
        db.集合名.update({},{$set:{users:"张杰"}})  修改第一条数据
        db.集合名.update({},{$set:{users:"张杰"}})  如何写了条件,就会根据条件中的第一个进行修改

        db.集合名.update({},{$set:{users:"张杰2"}},{multi:true}) : 修改多条数据
        如果$set设置的字段不存在的话,就会创建后赋值,新添加字段的操作。

        $set -> 修改字段值,$inc -> 累加累减字段值(必须是数字类型)

        $inc -> 点赞、投票、播放量、粉丝数 ... 

        db.集合名.updateOne() 

    查:
        db.集合名.find() : 查看当前集合的所有数据
        db.集合名.find().count() : 数据的个数
        db.集合名.find({}) : 条件
            类似sql : select * from musicList where id = 1
        db.集合名.find({"_id":/users/}) : 进行模糊匹配
            类似sql : like 
            需求:搜索的需求
        db.集合名.find({},{name:1,age:1}) : 查询指定字段的数据
            类似于sql中的 select name,age from musiclist
            name : 1 -> 要name字段
            name : 0 -> 排除掉name字段
        db.集合名.find().sort({age : 1})  : 排序
                1 升序 -1 降序
        db.集合名.find().skip(10) : 跳过10条
            一般limit和skip一起使用,可以做分页的处理
        db.集合名.findOne() : 找一条数据(默认就是第一条)